java 中BIO、NIO、AIO 有什么区别?

BIO为同步阻塞模型,每个连接需独立线程处理,适用于低并发场景;NIO基于通道和选择器实现同步非阻塞,单线程可管理多连接,适合高并发应用;AIO为异步非阻塞模型,由系统完成读写并回调通知,效率最高但编程复杂,Java中应用较少。

在 Java 中,BIO、NIO 和 AIO 是三种不同的 I/O 模型,它们在处理数据读写的方式上有本质区别,适用于不同场景。

BIO(Blocking I/O):同步阻塞 I/O

BIO 是传统的 I/O 模型,每个连接都需要一个独立的线程来处理。当数据没有准备好时,线程会一直阻塞等待。

特点:
  • 一个连接对应一个线程,资源消耗大
  • 编程模型简单,易于理解
  • 在高并发场景下性能差,容易因线程过多导致系统崩溃

适用于连接数少、并发

低的场景,比如早期的客户端-服务器通信程序。

NIO(Non-blocking I/O):同步非阻塞 I/O

NIO 使用通道(Channel)和缓冲区(Buffer)进行数据操作,并通过选择器(Selector)实现一个线程管理多个连接。

核心组件:
  • Channel:类似流,但可读可写,支持异步传输
  • Buffer:数据载体,必须通过 Buffer 进行读写
  • Selector:监听多个通道事件(如连接、读就绪),实现单线程管理多通道

采用事件驱动机制,只有在通道真正有数据可读或可写时才进行操作,避免了线程空等。

适合高并发、大量连接但同时活跃连接不多的场景,如 Netty 就是基于 NIO 实现的。

AIO(Asynchronous I/O):异步非阻塞 I/O

AIO 是真正的异步 I/O 模型,读写操作由操作系统完成,完成后通知应用程序(通过回调函数)。

特点:
  • 不需轮询,完全由系统回调通知结果
  • 更高效地利用系统资源,减少线程切换开销
  • 编程复杂度较高,调试困难

AIO 在 Linux 上依赖于 epoll 的异步模式,但在 Java 中使用较少,主要因为底层支持不够完善,且 NIO 已能满足大多数需求。

基本上就这些。BIO 简单但效率低,NIO 高效应用广,AIO 更进一步但使用门槛高。选择哪种模型,取决于实际业务对性能和复杂度的要求。