[面试题] 并行、并发、同步、异步、阻塞、非阻塞分别是什么意思?
📖 版块 A:知识讲解版 (温故知新)
- 并发(Concurrency):
- 在一段时间内,多个任务都在推进。
- 单核 CPU 通过时间片切换,也能实现并发。
- 并行(Parallelism):
- 在同一时刻,多个任务真正同时执行。
- 通常依赖多核 CPU 或多台机器。
- 同步(Synchronous):
- 调用方发起操作后,要等结果回来,流程才能继续。
- 关注的是“结果何时拿到”。
- 异步(Asynchronous):
- 调用方发起操作后,不必原地等待结果。
- 结果往往通过回调、通知、消息等方式返回。
- 阻塞(Blocking):
- 调用方线程在等待期间被挂起,不能继续做别的事情。
- 关注的是“线程会不会停住”。
- 非阻塞(Non-Blocking):
- 调用后即使结果还没准备好,线程也不会被挂起。
- 可以继续做别的事情,或者稍后再轮询结果。
- 一个特别重要的点:
- 同步/异步 和 阻塞/非阻塞 不是一个维度。
- 同步调用既可能是阻塞的,也可能是同步非阻塞的。
- 异步调用通常希望做到非阻塞,但二者不能简单画等号。
🎤 版块 B:面试实战版 (高手逐字稿)
Q:并行、并发、同步、异步、阻塞、非阻塞分别是什么意思?
🧠 破局思路:这道题最容易丢分的地方,是把六个概念混在一起说。高手的答法是先按维度拆开,再补一句“同步不等于阻塞,异步也不天然等于非阻塞”。
💬 高手逐字稿:
这几个概念很容易混,但其实它们根本不是同一个维度。
先说并发和并行。这两个词描述的是多个任务“怎么被执行”。
并发指的是在一段时间内,多个任务都在向前推进。哪怕只有一个 CPU,也可以通过时间片轮转,在任务 A 和任务 B 之间不断切换,让它们看起来像同时在做。
并行则更严格,它要求在同一时刻,多个任务真的同时运行。这个通常需要多核 CPU,或者多台机器共同执行。
再说同步和异步。这两个词描述的是“拿结果的方式”。
同步就是我发起一个调用后,必须等它返回结果,我才能继续往下走;** 异步**则是我发起调用后,不必原地等,可以先去干别的,等结果好了再通过通知、回调、事件之类的方式回来找我。
最后说阻塞和非阻塞。这描述的是“调用方线程会不会停住”。
阻塞表示线程在等待结果期间会被挂起,什么也干不了;** 非阻塞**表示线程不会被挂住,即使这次没拿到结果,也可以先返回,稍后再试。
我觉得这道题最加分的一句话是:同步不等于阻塞,异步也不天然等于非阻塞。
比如同步调用通常很容易做成阻塞式,但也可以设计成“不断轮询直到成功”的同步非阻塞模式;异步调用往往是为了让主线程不被卡住,但异步框架内部未必完全没有阻塞。
所以总结一下:
- 并发/并行看的是多个任务怎么执行。
- 同步/异步看的是结果怎么返回。
- 阻塞/非阻塞看的是线程会不会停住。
只要把这三个维度拆开,很多网络 IO、线程模型、消息队列的问题都会一下变清楚。
最后更新于: