刚开始学并发编程时,很多人都会觉得它有点“反直觉”。
一个程序明明可以:
先执行 A
再执行 B
最后执行 C
为什么非要搞出:
- 多线程
- 线程池
- 锁
- CAS
- volatile
- 并发容器
这些复杂东西?
其实并发编程出现的原因很简单:
程序里的很多时间,并不是在计算,而是在等待。
如果等待期间什么都不做,CPU 就被浪费了。
一、先想象一家只有一个服务员的餐厅
假设餐厅只有一个服务员。
现在 A 客人点了一份牛排。
如果服务员的工作方式是:
给 A 点菜
↓
去厨房
↓
站着等牛排做好
↓
端给 A
↓
再接待 B
牛排要做 10 分钟。
那这 10 分钟里,B、C、D 客人全部只能干等。
显然不合理。
正常的做法应该是:
给 A 点菜
↓
厨房开始做
同时:
给 B 点菜
↓
给 C 结账
↓
给 D 上水
A 的菜好了以后,再回来给 A 上菜。
这就是并发最核心的思想:
一个任务在等待时,让执行资源去处理其他任务。
程序也是一样。
二、程序为什么有这么多“等待”?
比如一个 Web 接口:
publicUsergetUser(Longid){returnuserMapper.selectById(id);}