一句话:
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]如下:
然后来说说同步、异步、阻塞非阻塞:
| 概念 | 流程图 | 备注 |
| 同步阻塞IO | 针对Sender而言,请求发送出去以后,一直等到Receiver有结果了才返回,这是同步。在Sender获取结果的期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。 | |
| 异步阻塞IO | 针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。 | |
| 同步非阻塞IO | 针对Sender而言,请求发送出去以后,立刻返回,然后再不停的发送请求,直到Receiver处理好结果后,最后一次发请求给Receiver才获得response。Sender一直在主动轮询,每一个请求都是同步的,整个过程也是同步的。在Sender等待Receiver的response期间一直是可以处理其它事情的(比如:可以发送请求询问结果),这是非阻塞。 | |
| 异步非阻塞IO | 针对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]:
Reference:
[6]Java新一代网络编程模型AIO原理及Linux系统AIO介绍
[7]浅析Java 中的流--BIO、NIO、AIO及NIO中的三大组件Buffer,Channel,Selector