一、先记住一句话
BIO = 同步阻塞
NIO = 同步非阻塞
AIO = 异步非阻塞
二、用生活例子秒懂
1. BIO(同步阻塞)
去餐厅吃饭,必须站在窗口死等,厨师不做好你就不能动。
- 一个连接 = 一个线程
- 连接不读完,线程一直卡住
- 并发低,浪费资源
2. NIO(同步非阻塞)
去餐厅吃饭,不用死等,隔一会儿去问一下好了没,没好就去干别的。
- 一个线程 = 管理多个连接
- 线程不卡住,轮询检查
- 高并发、高性能
3. AIO(异步非阻塞)
点餐后直接走人,厨师做好了主动打电话通知你。
- 完全不用等
- 操作系统主动通知
- 真正异步
三、核心区别(直接背)
| 特性 | BIO | NIO | AIO |
|---|---|---|---|
| 全称 | 同步阻塞IO | 同步非阻塞IO | 异步非阻塞IO |
| 线程模型 | 1连接=1线程 | 1线程=多连接 | 依赖操作系统回调 |
| 是否阻塞 | 阻塞 | 非阻塞 | 非阻塞 |
| 复杂度 | 简单 | 中等 | 复杂 |
| 性能 | 低 | 高 | 很高 |
| 适用场景 | 连接少 | 高并发 | 高并发+长连接 |
| Java实现 | ServerSocket | Java NIO | AsynchronousChannel |
| 实际使用 | 极少 | Netty(主流) | 很少用 |
四、底层核心区别
1. BIO
- 面向流
- 阻塞:
accept()、read()都会卡住线程 - 无法支撑高并发
2. NIO(重点!面试必考)
三大组件:
- Channel(通道):双向读写
- Buffer(缓冲区):数据先放缓冲区
- Selector(选择器):一个线程管理成千上万个连接
核心思想:一个线程 + 一个选择器 = 管理所有连接
3. AIO
- 不需要 Selector
- 基于回调
- 操作系统完成IO后主动通知
- Windows 支持好,Linux 支持一般
五、最关键结论(必须记住)
- BIO 是传统IO,阻塞,低并发
- NIO 是非阻塞,高并发,Java 后端主流
- AIO 是真正异步,用得少
- 现在高并发网络编程 = 全用 Netty(NIO 框架)
六、面试高频题(标准答案)
1. BIO、NIO、AIO 区别?
- BIO:同步阻塞,一个连接一个线程,并发低。
- NIO:同步非阻塞,一个线程管理多个连接,有Selector、Channel、Buffer。
- AIO:异步非阻塞,基于回调,操作系统主动通知。
2. 为什么NIO能高并发?
因为Selector 选择器让一个线程可以监听成千上万个连接,不阻塞,资源消耗极低。
3. 企业用哪个?
NIO + Netty,几乎所有高性能框架(Dubbo、RocketMQ、Redis客户端)都用 Netty。
总结
- BIO = 死等
- NIO = 轮询
- AIO = 回调通知