【Java基础 | 第八篇】BIO NIO AIO
目录
BIO、NIO、AIO 的区别
| 特性 | BIO (Blocking I/O) 同步阻塞 IO | NIO (Non-Blocking I/O) 同步非阻塞 IO | AIO (Asynchronous I/O) 异步非阻塞 IO |
| 核心模型 | 面向流,一个连接一个线程 | 面向缓冲区,Reactor 模型(多路复用) | 面向缓冲区,Proactor 模型 |
| 阻塞性 | 阻塞 | 非阻塞 | 非阻塞 |
| 同步 / 异步 | 同步 | 同步 | 异步 |
| 核心组件 | Socket、ServerSocket | Channel、Buffer、Selector | AsynchronousSocketChannel、AsynchronousServerSocketChannel |
| 线程模型 | 连接数 = 线程数(高资源消耗) | 一个线程处理多个连接(多路复用) | 回调 / Future 处理结果(无需轮询) |
| 适用场景 | 连接数少、需求简单的场景(如简单 Socket) | 连接数多、短连接(如 Netty、RPC) | 连接数多、长连接(如文件下载、大数据传输) |
| JDK 版本 | JDK 1.0+ | JDK 1.4+ | JDK 1.7+ (NIO.2) |
-
BIO(同步阻塞 IO)
-
核心特点:线程发起 IO 请求后,会一直阻塞直到数据读写完成,期间线程无法做其他事。
-
问题:每来一个连接就需要创建一个线程,连接数多的时候会导致线程数暴增,内存占用高、上下文切换频繁,性能瓶颈明显。
-
-
NIO(同步非阻塞 IO)
-
核心特点:
-
非阻塞:线程发起 IO 请求后,若数据未准备好,不会阻塞,而是返回一个状态,线程可以处理其他任务。
-
多路复用:通过
Selector(选择器)监听多个Channel(通道)的事件(连接、读、写),一个线程就能处理多个连接,解决了 BIO 线程膨胀的问题。 -
面向缓冲区:数据读写先经过缓冲区,而非直接操作流,更灵活。
-
-
-
AIO(异步非阻塞 IO)
-
核心特点:
-
异步:线程发起 IO 请求后,直接返回,由操作系统完成数据读写,完成后通过回调函数或
Future通知线程处理结果,全程无需线程参与轮询。 -
真正的非阻塞:相比 NIO(同步非阻塞,线程仍需轮询事件),AIO 完全由系统接管,线程利用率更高。
-
-
NIO的原理
通过三大核心组件协同工作实现非阻塞 IO
| 组件 | 作用 | 底层实现 |
| Buffer | 数据容器(读写数据的缓冲区) | 基于堆内存(HeapByteBuffer)或直接内存(DirectByteBuffer,映射到系统物理内存) |
| Channel | 数据传输通道(双向、可非阻塞) | 封装操作系统的文件描述符(FileDescriptor),对应底层的 socket / 文件 IO 通道 |
| Selector | IO 多路复用器(核心) | 底层调用操作系统的 IO 多路复用 API(epoll/select/poll),监听多个 Channel 的事件 |

注册阶段:每个客户端(client1/client2…)通过 Channel 向 Selector 注册连接、读、写等事件。
轮询阶段:单个线程驱动 Selector,循环检测所有注册的 Channel 是否有事件就绪。
事件处理:当某个 Channel 的事件就绪时,Selector 会将其标记为就绪状态,线程获取该事件对应的 SelectionKey,并通过 Channel 和 Buffer 完成数据读写。
循环复用:线程处理完就绪事件后,继续回到 Selector 轮询下一批就绪事件,实现一个线程高效处理大量连接。
使用NIO的框架之一:Netty
Netty。
Netty 的 I/O 模型是基于非阻塞 I/O 实现的,底层依赖的是 NIO 框架的多路复用器 Selector。采用 epoll 模式后,只需要一个线程负责 Selector 的轮询。当有数据处于就绪状态后,需要一个事件分发器(Event Dispather),它负责将读写事件分发给对应的读写事件处理器(Event Handler)。事件分发器有两种设计模式:Reactor 和 Proactor,Reactor 采用同步 I/O, Proactor 采用异步 I/O。

Reactor 实现相对简单,适合处理耗时短的场景,对于耗时长的 I/O 操作容易造成阻塞。Proactor 性能更高,但是实现逻辑非常复杂,适合图片或视频流分析服务器,目前主流的事件驱动模型还是依赖 select 或 epoll 来实现。
上述内容也同步在我的飞书,欢迎访问
https://my.feishu.cn/wiki/QLauws6lWif1pnkhB8IcAvkhncc?from=from_copylink
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,你们的支持就是我坚持下去的动力!
更多推荐



所有评论(0)