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]如下:
然后来说说同步、异步、阻塞非阻塞:
概念 | 流程图 | 备注 |
同步阻塞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: