2.5.2 不同I/O模型对比
不同的I/O模型由于线程模型、API等差别很大,所以用法的差异也非常大。由于之前的几个小节已经集中对这几种I/O的API和用法进行了说明,本小节会重点对这几种I/O进行功能对比。如表2-1所示。
表2-1 几种I/O模型的功能和特性对比
|
|
同步阻塞I/O(BIO)
|
伪异步I/O
|
非阻塞I/O(NIO)
|
异步I/O(AIO)
|
|
客户端个数:I/O线程
|
1:1
|
M:N(其中M可以大于N)
|
M:1(1个I/O线程处理多个客户端连接)
|
M:0(不需要启动额外的I/O线程,被动回调)
|
|
I/O类型(阻塞)
|
阻塞I/O
|
阻塞I/O
|
非阻塞I/O
|
非阻塞I/O
|
|
I/O类型(同步)
|
同步I/O
|
同步I/O
|
同步I/O(I/O多路复用)
|
异步I/O
|
|
API使用难度
|
简单
|
简单
|
非常复杂
|
复杂
|
|
调试难度
|
简单
|
简单
|
复杂
|
复杂
|
|
可靠性
|
非常差
|
差
|
高
|
高
|
|
吞吐量
|
低
|
中
|
高
|
高
|
尽管本书是专门介绍NIO框架Netty的,但是,并不意味着所有的Java网络编程都必须要选择NIO和Netty,具体选择什么样的I/O模型或者NIO框架,完全基于业务的实际应用场景和性能诉求,如果客户端并发连接数不多,周边对接的网元不多,服务器的负载也不重,那就完全没必要选择NIO做服务端;如果是相反情况,那就要考虑选择合适的NIO框架进行开发。
对比完Java的几种主流I/O模型之后,我们继续看下为什么要选择Netty进行NIO开发,而不是直接使用JDK的NIO原生类库。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码

51CTO读书频道活动讨论群:342347198