java 的 IO 模型分类和特点
IO 模型的分类
Java 中的 IO 方式大体上可以分为三类:BIO:同步且阻塞 NIO:同步非阻塞 AIO:异步非阻塞
BIO
BIO 指的是同步且阻塞型 IO,特点是在进行 IO 操作时,比如在读取或者写入时,只要读取动作/写入动作开始,线程就会一直阻塞,一直等待到读取/写入动作完全执行完成后,线程才会从阻塞状态中恢复。
对于服务器,实现模式是客户端每有一个连接进来,就会创建一个线程,这样实现会造成资源的浪费,因为客户端如果连接进入后,就算不实现任何逻辑,处理任何 IO,也会占用服务器的资源。
NIO
NIO 指的是同步非阻塞型 IO,特点一个线程可以处理多个请求,不像是 BIO 一个连接创建一个线程,这种处理模式叫做多路复用,客户端的连接请求都会到多路复用器,多路复用器会自动轮询,获取到连接有 I/O 请求就会处理。 但是线程在处理 IO 请求时也会进入阻塞状态。
AIO
AIO 是 NIO 的升级版,指的是异步非阻塞 IO,只有收到客户端有效的请求,服务器才会启动线程,并且在处理 IO 请求时,不会阻塞当前线程,当后台处理完成 IO 操作后,会通知相应的线程,进行后续的处理。
总结
BIO 由于相对相率最低,而且由于同步阻塞的特性,只适用于连接数较小,且 IO 操作对象不是很大的场景,并且对服务器的资源强相关。
NIO 方式适用于连接数较多的场景,因为就算连接数增长,服务器也不会启动很多的线程占用资源,但是由于处理的线程数不多,对于每个请求的处理时间就有要求,平均处理时间不能太长,不然其他请求排队等待,也会形成阻塞的现状。
AIO 适合用于连接数目多,且处理时间长的场景,底层会利用到操作系统参与。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/c6697c7f6318f826dffcea6e9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论