AIO+BIO+NIO+同步+异步+阻塞+非阻塞

一句话:

AIO是NIO的升级版,NIO是BIO的升级版[1]

所以其实是用AIO

IO名称 JDK版本 数据类型 IO类型
IO    
BIO(偶尔也叫做OIO) <1.4   同步阻塞IO
NIO 1.4 缓冲 同步非阻塞IO
AIO(NIO2.0)[7] 1.7   异步非阻塞IO

 

 

对比[3]如下:

AIO+BIO+NIO+同步+异步+阻塞+非阻塞

 

然后来说说同步、异步、阻塞非阻塞:

概念 流程图 备注
同步阻塞IO AIO+BIO+NIO+同步+异步+阻塞+非阻塞 针对Sender而言,请求发送出去以后,一直等到Receiver有结果了才返回,这是同步。在Sender获取结果的期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。
异步阻塞IO AIO+BIO+NIO+同步+异步+阻塞+非阻塞 针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。
同步非阻塞IO AIO+BIO+NIO+同步+异步+阻塞+非阻塞 针对Sender而言,请求发送出去以后,立刻返回,然后再不停的发送请求,直到Receiver处理好结果后,最后一次发请求给Receiver才获得response。Sender一直在主动轮询,每一个请求都是同步的,整个过程也是同步的。在Sender等待Receiver的response期间一直是可以处理其它事情的(比如:可以发送请求询问结果),这是非阻塞。
异步非阻塞IO AIO+BIO+NIO+同步+异步+阻塞+非阻塞 针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直是可以处理其它事情的,这是非阻塞。

 

记忆的时候,上面的四种情况重点记忆“阻塞和非阻塞”极客

上面四种情况可以知道性能上的最佳方式是:异步阻塞IO和异步非阻塞IO

 

两种I/O多路复用模式

模式 原理 应用场景 举例
reactor Linux epoll 同步IO callback
proactor Windows IO completion port 异步IO future/await

 

基本 Linux I/O 模型的简单矩阵[6]:
AIO+BIO+NIO+同步+异步+阻塞+非阻塞

 

Reference:

[1]Java核心(五)深入理解BIO、NIO、AIO

[2]简述JAVA同步、异步、阻塞和非阻塞之间的区别

[3]Java AIO 基本介绍

[4]如何深刻理解Reactor和Proactor?

[5]java-IO-多路复用机制

[6]Java新一代网络编程模型AIO原理及Linux系统AIO介绍

[7]浅析Java 中的流--BIO、NIO、AIO及NIO中的三大组件Buffer,Channel,Selector