BIO/NIO/AIO 以及IO多路复用
要搞懂这些概念的关系,咱们用「餐厅接客上菜」的比喻串起来,先逐个拆成通俗说法,再讲它们怎么搭在一起:
1. 最基础:Socket(通信的 “管道”)
所有这些概念,最终都是为了「通过网络传数据」—— 而 Socket 就是「两台电脑之间的通信管道」。
比如你用微信发消息,微信就会先创建一个 Socket,通过这个 “管道” 把消息发给腾讯服务器。
它是所有 IO(输入输出)操作的「基础载体」,没有 Socket,就没法在网络上传数据。
2. 怎么处理管道数据?—— BIO/NIO/AIO(三种 “干活模式”)
有了 Socket(管道),接下来要解决:怎么从管道里读数据、写数据?
这就像餐厅有了 “客人座位(管道)”,服务员怎么 “上菜 / 收碗(处理数据)”?三种模式对应三种服务方式:
| 模式 | 通俗理解(餐厅版) | 核心特点 | 适用场景 |
|---|---|---|---|
| BIO(同步阻塞) | 1 个服务员盯 1 桌客人:客人没点完菜,服务员就站在旁边等,啥也干不了 | 1 个线程管 1 个 Socket,读不到数据就 “堵着等” | 简单场景(比如单机小工具),连接少的时候能用 |
| NIO(同步非阻塞) | 1 个服务员盯 10 桌客人:服务员不用站着等,每隔一会儿转一圈问 “要上菜吗?”,没需求就去盯其他桌 | 1 个线程管多个 Socket,读不到数据就 “先去忙别的”,靠 “主动查” 判断是否有数据 | 连接多的场景(比如服务器),比如 Tomcat、Netty |
| AIO(异步非阻塞) | 客人自己按铃叫服务员:服务员不用盯桌,客人需要了按铃,服务员再过来 | 线程不用管 Socket,数据准备好后,系统会 “主动通知” 线程来处理 | 超大规模连接(比如高并发服务器),但 Java 里用得少(Linux 下依赖 epoll 的异步能力) |
3. NIO 的核心工具:Selector/Channel/Buffer(服务员的 “三件套”)
NIO 要实现 “1 个服务员盯多桌”,不能光靠服务员瞎转 —— 得有工具帮忙。这三个就是 NIO 的「核心组件」,缺一不可:
-
Channel(更灵活的 “管道”):
是对 Socket 的 “升级封装”——BIO 里的 Socket 只能 “单向读 / 写”(比如输入流只能读,输出流只能写),而 Channel 是 “双向的”(一个 Channel 既能读又能写,像一根双向管道)。
它就像 “客人座位的升级版”:既能上菜(写数据),又能收碗(读数据),不用换座位。 -
Buffer(装数据的 “桶”):
NIO 里不能直接 “从 Channel 里读数据”,必须先把数据放到 Buffer(缓冲区)里,再从 Buffer 里读。
就像服务员不能直接从厨房锅里抓菜给客人,得先盛到盘子(Buffer)里,再端过去 ——Buffer 就是 “装数据的盘子 / 桶”,用来暂存数据。 -
Selector(“监工”/“叫号器”):
实现 “1 个线程管多个 Channel” 的关键!它是 NIO 的 “核心大脑”,作用是「监听多个 Channel 的状态」:比如 “这个 Channel 有数据可以读了”“那个 Channel 能写数据了”。
就像服务员手里的 “叫号机”:服务员不用挨个问客人,看一眼叫号机就知道 “哪几桌需要服务”——Selector 会把 “有状态变化的 Channel” 挑出来,让线程只处理这些 Channel,不用瞎忙活。
4. IO 多路复用:思路 + 底层实现(服务员怎么高效 “盯桌”?)
前面说 NIO 靠 Selector 实现 “1 个线程管多 Channel”,这个能力的本质是「IO 多路复用」—— 它不是一个具体工具,而是一种「技术思路」:让一个线程同时 “监视” 多个 IO 通道(Socket/Channel),哪个通道有数据就处理哪个。
而「select/poll/epoll」是 Linux 系统下,实现「IO 多路复用」的三种底层方法—— 相当于 Selector(监工)的 “三种干活手段”,各有优劣:
| 底层方法 | 通俗理解(监工手段) | 缺点 | 优点 |
|---|---|---|---|
| select | 监工拿个小本本记着所有要盯的桌号,每次都要逐个念一遍 “1 号桌有需求吗?2 号桌?…” | 1. 最多盯 1024 桌(有上限);2. 每次都要挨个问,人多了慢 | 兼容性好,所有系统都支持 |
| poll | 监工换了个无限长的本本,能记无数桌号,但还是得逐个问 “有需求吗?” | 没有桌数上限,但还是要挨个问,人多了慢 | 解决了 select 的桌数限制 |
| epoll | 监工给每桌装了个 “小铃铛”,有需求的桌会主动摇铃,监工只看摇铃的桌 | 几乎没缺点(效率极高) | 只处理有需求的通道,百万级连接也快,Linux 下首选 |
最后:把所有关系串成一句话
Socket 是网络通信的 “管道”,BIO/NIO/AIO 是处理管道数据的三种 “干活模式”;其中 NIO 靠 “IO 多路复用” 思路实现 “1 个线程管多管道”,这个思路的核心工具是 Selector(监工)、Channel(双向管道)、Buffer(数据桶),而 select/poll/epoll 是 Linux 下实现 IO 多路复用的三种底层 “监工手段”(epoll 最高效)。
更多推荐

所有评论(0)