系列终章|前面讲了线程 → 线程池 → Reactor → 协程 → 协程边界
本篇只做一件事:把所有模型统一成一个认知
一、先说结论(终极一句话)
👉 所有并发模型,本质都在解决一件事:如何处理"等待",不浪费CPU
二、把所有模型放在一条线上看
多线程(最原始)
线程:执行 + 等待
👉 特点**:简单,但线程被浪费**
线程池(工程优化)
线程复用,减少创建成本
👉 但:线程仍然会阻塞
Reactor(事件驱动)
线程只执行
等待交给OS(epoll)
👉 特点:高效,但编程复杂
🟩 协程(任务驱动)
线程只执行
任务自己等待(挂起)
👉 特点:高效 + 易写
三、统一模型(核心)
👉 把它们抽象成一个结构👇
CPU
↓
线程(执行资源)
↓
调度机制(OS / Reactor / Runtime)
↓
任务(业务逻辑)
👉 三种模型的区别只在:
谁负责"等待"和"调度"
四、三种模型统一对比(核心表)
| 模型 | 谁负责等待 | 谁负责调度 | 本质 |
|---|---|---|---|
| 多线程 | 线程 | OS | 线程驱动 |
| Reactor | OS | Reactor(事件) | 事件驱动 |
| 协程 | 任务(挂起) | Runtime | 任务驱动 |
五、演进的本质(最重要)
👉 一句话讲清:
多线程:线程等
Reactor:OS等
协程:任务等
👉 本质变化:
等待逐步从线程中剥离
六、再升一层(核心思想)
👉 所有模型其实在做同一件事:
减少"无意义工作"
什么是无意义?
线程在等IO
CPU空转
频繁切换
👉 优化路径:
线程模型 → 减少线程创建
Reactor → 减少等待
协程 → 减少占用
七、工程选择(最实用)
不同场景选不同模型:
普通业务
线程池 + 阻塞IO
👉 优点:
简单、稳定、好维护
高并发系统
Reactor + 线程池(Netty)
新趋势
协程 / 虚拟线程
八、总结
并发模型不是"谁更好",而是"在哪个层级优化等待"
九、面试终极回答
并发模型的本质都是围绕"等待"展开的。
- 传统多线程模型中,线程既负责执行也负责等待,容易造成资源浪费;
- Reactor通过IO多路复用把等待交给操作系统,使线程只在事件就绪时执行;
- 协程则进一步将等待从线程级下沉到任务级,通过挂起机制避免线程被占用。
不同模型只是优化"等待"的层级不同,没有绝对优劣,需要根据场景选择。
十、系列总结
线程 → 线程池 → Reactor → 协程
本质演进:
线程等 → OS等 → 任务等
这就是"体系化认知"的标志