BIO、NIO、AIO?

BIO (blocking I/O): 这是传统的 I/O,采用同步阻塞方式。服务器的实现模式是一连接一线程,即当客户端有连接请求时,服务器端需要启动一个线程来处理。如果这个连接不做任何操作,就会造成不必要的线程开销。为了改善这个问题,可以使用连接池机制来实现对多个客户端连接的处理。

BIO 方式适用于连接数目比较小且固定的架构。这种方式对服务器资源要求较高,且并发受到应用程序的限制。在 JDK 1.4 之前,BIO 是唯一的选择,它的程序简单易于理解。

NIO (non-blocking I/O): 全称为 Java non-blocking I/O,是 JDK 提供的新的 API。从 JDK 1.4 开始,Java 提供了一系列改进的输入/输出特性,被统称为 NIO (New I/O)。

NIO 是同步非阻塞的。服务器端使用一个线程处理多个连接,客户端发送的连接请求会注册到多路复用器上,多路复用器会轮询连接,一旦发现有 I/O 请求,就进行处理。NIO 的数据操作是面向缓冲区(Buffer)的,必须从缓冲区中读取或写入数据。

因此,NIO 的运行机制如下:

  • 每个 Channel 对应一个 Buffer。
  • Selector 对应一个线程,一个线程对应多个 Channel。
  • Selector 根据不同的事件,在各个通道上进行切换。
  • Buffer 是内存块,底层存储数据。

AIO: JDK 7 引入了 Asynchronous I/O,是异步非阻塞的 I/O。在 I/O 编程中,常用到两种模式:Reactor 和 Proactor。Java 的 NIO 采用的是 Reactor 模式,当有事件触发时,服务器端得到通知并进行相应的处理,处理完成后才通知服务端程序启动线程去处理。AIO 通常适用于连接数较多且连接时间较长的应用场景。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题