1.3.1、缓冲区(Buffer)
本质是可以读写数据的内存块,Channel读取或者写入的数据必须通过Buffer:

java.nio.Buffer抽象类的属性:
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

1.3.2、通道(Channel)
通道是双向的,可以读操作、也可以写操作。
java.nio.channels.Channel接口的常用实现类:

FileChannel用于文件的数据读写,DatagramChannel用于UDP的数据读写,ServerSocketChannel和SocketChannel用于TCP的数据读写。
1.3.3、选择器(Selector)
Selector选择器使用一个线程来维护。多个Channel会以事件的方式注册到同一个Selector,当有事件发生时,Selector会获取事件,然后针对每个事件进行响应的处理。这样就不必为每个连接创建一个线程,不用维护多线程,也不会有多线程之间的上下文切换导致的系统的开销。
Selector示意图:

1.4、AIO
异步非阻塞模型,AIO引入异步通道的概念,使用了Proactor,只有有效的请求才启动线程,特点是先由操作系统完成后,才通知服务器端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。
1.5、BIO NIO AIO 对比

本文深入解析了Java NIO中的缓冲区(Buffer)、通道(Channel)、选择器(Selector)以及异步I/O(AIO)和BIONIOAIO的区别。讲解了Buffer的内部结构和Channel的基本操作,并阐述了Selector如何提高并发性能。最后对比了AIO和BIONIO在应用中的优势和适用场景。
https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0
4万+

被折叠的 条评论
为什么被折叠?



