跳转至

BIO、NIO、AIO 的区别

一、BIO

同步阻塞。

ServerSocket ss = new ServerSocket(8080);
while (true) {
    Socket s = ss.accept();  // 阻塞
    new Thread(() -> read(s)).start();
}
  • 一个连接一个线程。
  • 连接多线程多。

二、NIO

同步非阻塞。

Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ);
while (true) {
    selector.select();
    // 处理就绪事件
}
  • 一个线程处理所有连接。
  • IO 多路复用。
  • 三大组件:Channel、Buffer、Selector。

三、AIO

异步非阻塞。

AsynchronousServerSocketChannel channel = ...;
channel.accept(null, new CompletionHandler<>() {
    public void completed(...) {}
});
  • 操作系统完成 IO 后通知应用。
  • 真正异步。

四、对比

BIO NIO AIO
模型 同步阻塞 同步非阻塞 异步非阻塞
线程 一连接一线程 一个线程多连接 操作系统回调
适用 连接少 连接多 连接多
代表 Tomcat BIO Netty Windows IOCP

五、Netty 用 NIO

AIO 在 Linux 不成熟,Netty 用 NIO。

一句话

BIO 阻塞,NIO 多路复用,AIO 异步回调。