一、先搞懂核心前提:IO是什么?
IO = Input/Output ,就是程序和外部资源(文件、网络、数据库)数据交换 的过程。
核心痛点:IO速度远慢于CPU速度 ,所以不同IO模型,本质是等待方式不同。
二、三大IO模型超通俗讲解
1. BIO:Blocking IO ------ 同步阻塞IO
✅ 生活类比:餐厅单点服务员
你去餐厅吃饭,一个服务员只服务你一个人,你不点单,服务员就站在那干等;你不吃完,服务员不接下一个客人。
📊 图示
客户端1 → 线程1 → 阻塞等待IO完成 → 处理
客户端2 → 线程2 → 阻塞等待IO完成 → 处理
客户端3 → 线程3 → 阻塞等待IO完成 → 处理

特点 :一个连接对应一个线程,连接等待时,线程全程阻塞,啥也不干。
🔧 核心原理
- 同步:用户线程主动发起IO,自己等结果
- 阻塞:IO没完成时,线程被挂起,CPU资源浪费
- Java实现:
ServerSocket、Socket(传统网络IO)
💡 优缺点
- 优点:代码简单,逻辑清晰,适合新手
- 缺点:并发能力极差,线程数=连接数,高并发下OOM
🎯 使用场景
- 连接数极少、固定的小项目
- 单机连接数 < 1000 的简单服务
- 学习入门、测试Demo
2. NIO:Non-blocking IO ------ 同步非阻塞IO(Java NIO = New IO)
✅ 生活类比:餐厅叫号服务员
一个服务员同时盯多张桌子,不用一直等一个客人,轮流问:"你点好了吗?",没好就去问下一个,不用干等。
📊 图示
客户端连接 → Channel(通道)→ Buffer(缓冲区)
↓
Selector(选择器)→ 1个线程管理成千上万个连接

特点 :1个线程+Selector管理多个连接,连接不就绪时,线程去处理其他连接,不阻塞。
🔧 核心原理
- 同步:还是用户线程自己去轮询检查IO状态
- 非阻塞:IO未就绪时,线程立刻返回,不挂起
- 三大核心:
- Channel(通道):双向传输数据,像高速公路
- Buffer(缓冲区):数据中转站,读写都走Buffer
- Selector(选择器):管家,监听多个通道的就绪事件
💡 优缺点
- 优点:高并发,少量线程管理大量连接,资源占用低
- 缺点:编程复杂,需处理轮询、缓冲区、粘包拆包
🎯 使用场景
- 高并发、长连接场景(最常用)
- 聊天服务器、游戏服务器、物联网网关
- Java中间件:Netty、Mina、Redis客户端、Dubbo底层
3. AIO:Asynchronous IO ------ 异步非阻塞IO
✅ 生活类比:外卖配送
你点外卖,不用等,不用催,外卖做好了,骑手直接给你送上门,你该干嘛干嘛。
📊 图示
客户端发起IO请求 → 操作系统内核处理
↓(完全不用管)
用户线程做其他事
↓(IO完成后)
操作系统主动通知用户线程 → 处理数据
特点 :完全异步,用户线程发起请求后直接返回,IO完成由系统主动回调。
🔧 核心原理
- 异步:用户线程不参与IO过程,由内核完成后回调
- 非阻塞:全程不阻塞用户线程
- Java实现:
AsynchronousServerSocketChannel,基于操作系统异步API
💡 优缺点
- 优点:性能极致,线程利用率最高,编程逻辑更简洁(回调/Future)
- 缺点:操作系统支持不完善(Windows好,Linux一般),调试复杂
🎯 使用场景
- 连接数多且操作耗时的场景
- 大数据文件传输、高性能存储服务
- 目前生产用得少,Linux下AIO成熟度不如NIO
三、三大IO核心对比表(一目了然)
| 对比维度 | BIO | NIO | AIO |
|---|---|---|---|
| 全称 | 同步阻塞IO | 同步非阻塞IO | 异步非阻塞IO |
| 线程模型 | 1连接1线程 | 1线程管理多连接 | 依赖系统异步回调,极少线程 |
| 阻塞性 | 阻塞 | 非阻塞(轮询) | 非阻塞(回调) |
| 编程难度 | 简单 | 复杂 | 较复杂 |
| 并发能力 | 低 | 高 | 极高 |
| Java版本 | JDK1.0 | JDK1.4 | JDK1.7 |
| 主流框架 | 传统Socket | Netty、Mina | 极少商用 |
四、终极选择建议(工作直接用)
- 新手学习/小项目 :选 BIO,快速上手
- 生产高并发服务 :选 NIO + Netty(Java后端标配,99%场景用这个)
- 特殊高性能场景+系统适配 :再考虑 AIO