一、基本概念
IO:阻塞IO
BIO:同步阻塞IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器需要启动一个线程进行处理,如果这个链接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
NIO:同步非阻塞IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这需要用户进行不停的去询问。NIO的包括三个核心概念:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。
AIO:Asynchronous IO,异步非阻塞AIO。最大的特性时具有异步能力,这种能力对socket与文件I/O都起作用。AIO其实是一种在读写操作结束之前允许进行其他操作的I/O处理。
可概括为:BIO是“我要读”,NIO是“我可以读了”,AIO是“我读完了”
二、区别
(1)NIO和IO的主要区别
IO | NIO |
面向流 | 面向缓冲区 |
阻塞 | 非阻塞 |
无 | 选择器 |
(2)BIO,NIO,AIO对比
同步阻塞IO(VIO) | 非阻塞IO(NIO) | 异步IO(AIO) | |
客户端个数:IO线程 | 1:1 | M:1(1个IO线程处理多个客户端连接) | M:0(不需要启动额外的IO线程,被动回调) |
IO类型(阻塞) | 阻塞 | 非阻塞 | 非阻塞 |
IO类型(同步) | 同步 | 同步 | 异步 |
API使用难度 | 简单 | 简单 | 复杂 |
调试难度 | 简单 | 简单 | 复杂 |
可靠性 | 非常差 | 差 | 高 |
吞吐量 | 低 | 中 | 高 |
三、应用场景
BIO:适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4之前的唯一选择, 但是程序简单直观容易理解。
NIO:适用于连接数目多且连接比较短(轻操作)的架构,比如聊推荐服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO:适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK1.7开始支持。