Java中的BIO,NIO,AIO
1. 理解同步/异步、阻塞/非阻塞
-
同步和异步是针对应用程序和内核的交互而言的:
-
同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。
-
异步:用户进程触发IO操作以后便开始做自己的事情(实际上是委托给操作系统来进行处理),而当IO操作已经就绪的时候会得到系统的通知。
-
阻塞和非阻塞是针对于进程在进行IO操作的时候,是否需要等待完成:
-
阻塞:读取或者写入函数将一直等待。
-
非阻塞:读取或者写入函数会立即返回一个状态值。
2. Java中的BIO,NIO,AIO分别是什么,应用场景是什么?
BIO
-
概念:同步阻塞式IO,服务器端与客户端三次握手建立连接后,一个请求链路创建一个线程进行面向流的通信
-
特点:
-
面向流
-
一个请求对应一个线程
-
在任何一端出现网络性能问题时都影响另一端,无法满足高并发高性能的需求
-
如果这个连接不做任何事情时,会造成不必要的线程开销,可以使用线程池进行改善
-
应用场景:BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解
NIO
-
概念:同步非阻塞式IO,基于事件驱动的思想来实现了一个多路复用器,多路复用Reactor模式,当多路复用器轮询到有I/O请求时才启动一个线程进行处理
-
特点:
-
面向缓冲区
-
多个请求对应一个或者少量线程
-
读写过程是同步的,线程会等待。所以对于那些读写过程时间长的(例如有JDBC操作),NIO就不太适合。
-
应用场景:NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持
AIO
-
概念:异步非阻塞IO,基于unix事件驱动,不需要多路复用器对注册通道进行轮询,采用Proactor设计模式。当IO就绪后会收到操作系统的通知
-
特点:
-
一个有效请求对应一个线程
-
当IO就绪后会收到操作系统的通知,线程不必等待。所以AIO能够胜任那些重量级,读写过程长的任务。
-
应用场景:AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持
参考文章
BIO与NIO、AIO的区别(这个容易理解)
深入分析 Java I/O 的工作机制
Java NIO 系列教程
Java NIO原理图文分析及代码实现

浙公网安备 33010602011771号