java的IO模型分类和特点

164 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

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适合用于连接数目多,且处理时间长的场景,底层会利用到操作系统参与。