Java中的BIO、NIO和AIO可以理解为Java语言对操作系统中不同IO模型的封装。这样,程序员在需要使用不同IO模型时,无需从操作系统层面考虑,只需要使用Java中的API。
在了解BIO、NIO、AIO之前,我们需要搞清楚几个概念。
同步即发起一个调用后,被调用者未处理完请求之前,调用不返回。
异步就是发起一个调用后,立刻得到被调用者的表示已接收到请求的回应,但并没有返回结果。被调用者通常依靠事件,回调等机制来通知调用者其返回结果。
阻塞就是发起一个请求后,调用者会一直等待请求结果返回,在此期间无法从事其他任务。
非阻塞就是发起一个请求后,调用者不用一直等着结果返回,可以先去干其他事情。
那么BIO、NIO、AIO呢?
- BIO — 同步阻塞IO
在服务器中的实现为一个连接一个线程,适用于连接数目小且固定的架构。在BIO下,如果连接不做任何事,就会造成不必要的开销。且连接数目过大会导致服务器压力过大而宕机,当然这一点可以通过线程池来实现“伪异步IO”来解决。BIO的并发局限在应用中。 - NIO — 同步非阻塞IO
在服务器中的实现为一个请求一个线程,适用于连接数目多且短的架构,比如聊天服务器、弹幕系统。NIO的流是非阻塞的,所有的数据都使用缓冲区来进行处理。NIO的并发和BIO一样都局限在应用中。 - AIO — 异步非阻塞IO
服务器中的实现为一个有效请求一个线程,适用于连接数目多且长的架构,比如相册服务器。所有的IO请求都先交由操作系统处理之后,再启动线程进行处理。AIO充分调动操作系统参与并发,但是编程比较复杂,现在的应用也不是很多。