温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

day2 Java NIO

发布时间:2020-08-11 22:04:12 来源:ITPUB博客 阅读:122 作者:hgs19921112 栏目:编程语言

复习
1. BlockingQueue :阻塞式队列,使用的时候需要指定容量,而且容量指定之后不可改变。
    1. ArrayBlockingQueue :基于数组进行存储。
    2. LinkedBlockingQueue :基于链表进行存储。在使用的时候可以指定容量也可以不指定。如果不指定,
        则默认按照
Integer 最大值来计算。
    3. PriorityBlockingQueue :在使用的时候要求元素对应的类必须实现 Comparable 。在迭代的时候不保证
        元素的排序,只有在一个个的取得时候才能保证。
    4. SynchronousQueue :同步队列。只能存储一个元素。
2. ConcurrentMap :并发映射
    1. ConcurrentHashMap :底层在存储数据的时候是依靠分段锁机制,在 JDK1.8 中,采取了 CAS 无锁算法来
        取代了分段锁。底层依然是依靠的数组来作为基本结构,但是从
JDK1.8 开始,不再采取数组 + 链表结构而
        是采取数组
+ 红黑树机制。
        1. 红黑树本身是自平衡二叉查找树。
        2. 红黑树的特点
            1. 每一个节点非黑即红
            2. 根节点一定是黑色
            3. 红节点的子节点一定是黑色
            4. 最底层的叶子节点一定是黑色的 nil 节点
            5. 任意一条路径包含的黑节点的个数是一致的
            6. 插入的节点一定是红色
    3. 红黑树的平衡性修正
        1. 如果父节点以及叔父节点都是红色,则将父节点以及叔父节点涂黑,将祖父节点涂红
        2. 如果叔父节点是黑色,并且当前节点是右子叶,则以当前节点为基准进行左旋
        3. 如果叔父节点是黑色,并且当前节点是左子叶,则以父节点为基准进行右旋
    2. ConcurrentNavigableMap :并发导航映射。实现类之一是采取的跳跃表机制。跳跃表的特点是以空间
        换时间。时间复杂度是
O(logn)
3. 线程池
    1. 减少线程的创建和销毁从而节省内存资源
    2. 线程池是由核心线程、工作队列、临时线程以及拒绝执行处理器组成
    3. Callable Runnalbe 区别:返回值、异常、启动方式
4. Lock
    1.
synchronized 要更加的灵活和精细
    2. 默认是非公平策略,可以手动设置为公平
    3. CountDownLatch :线程递减锁 / 闭锁。当所有的线程都执行到同一节点之后进行统一处理
    4 . CyclicBarrier :栅栏。所有的线程到达同一节点之后再分别往下继续执行。
5. Exchanger :交换机。用于交换两个线程的信息
6. Semaphore :信号量。每一个线程取得一个信号,当信号被用完之后,其他线程只能被阻塞,只有当线
    程释放信号的时候,被阻塞的线程才能取得信号继续执行。

原子性操作
    在对象的底层进行加锁,保证对象在同一时刻只能被一个线程操作。
回顾:内存
java 将内存大致分为 5 块:栈内存、堆内存、方法区、本地方法栈、 PC 计数器(寄存器)。
栈内存:计算。所有的方法以及代码块的执行都是在栈内存中。每一个线程独享一个栈。
堆内存:存储对象。
方法区:存储类信息,常量(字面量、自定义常量)。
本地方法栈:计算。所有的本地方法(
native )的执行都在本地方法栈。
PC 计数器:程序的计数和线程的调度。
NIO
BIO - Blocking IO - 同步式阻塞式 IO
BIO 的缺点
1. 如果有大量的请求访问服务器,那么就要产生大量的线程去应对这些请求,导致服务器资源过于紧张
2. 在完成一次任务的过程中需要创建大量的输入或者输出流
3. 数据通过流传输,无法实现定点操作
4. 阻塞模式
NIO - New IO - 同步式非阻塞式 IO Buffer Channel Selector --- Buffer 是容器,用于存储数据; Channel
于传输;
Selector 进行过滤。
Buffer - 缓冲区
用于进行数据的存储,存储的时候都是用的数组。操作的都是基本类型。
数据在操作的时候是根据操作位
position 的位置决定。
限制位
limit 是决定操作位所能达到的最大值
标记位
mark 用于进行位置的标记,在出现错误的时候可以回到标记位进行重新操作,可以不用重复操作前边的数

容量位
capacity 用于固定容量
标记位
<= 操作位 <= 限制位 <= 容量位
翻转缓冲区:将限制位挪到操作位上,将操作位归零,清除标记位
重置缓冲区:将操作位挪到标记位
重绕缓冲区:将操作位归零,清除标记位
清空缓冲区:并不是将缓冲区真正清空,只是将操作位归零,将限制位挪到容量位,将标记位清除
Channel - 通道
传输数据,基于缓冲区进行传输。可以进行双向传输。
默认是阻塞的,可以设置为非阻塞。但是往往需要进行手动阻塞
TCP : SocketChannel , ServerSocketChannel
UDP : DatagramChannel
File : FileChannel
Selector - 多路复用通道选择器
可以选择出有用的事件或者是连接,进行事件的处理。
客户端的事件:可连接、可读、可写
服务器端的事件:可接受、可读、可写
tomcat5: 使用的是传统的 BIO
tomcat6:
使用 NIO
AIO - Asynchronous IO -
异步式非阻塞式 IO - JDK1.8 - NIO 的基础上延伸出来的,所以称之为 NIO.2

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI