个人理解这4个概念是从不同角度看:“多个任务被同时执行” 这件事。
从CPU的角度:并行、并发
从编程模式的角度:同步、异步
1、并行、并发:CPU视角
(1)并行:多个任务真正意义上被同时执行,非多核CPU或者多CPU环境不行,即CPU的每个核同时执行不同的任务。
(2)并发:泛指多个任务被 “同时” 执行,这个 “同时” 可以是人类感觉上的 “同时”(即退化的伪并行),也可以是真正意义上的 “同时”(即真并行,此时是并行)。至于是 人类感觉上的“同时”(伪并行)还是真正的 “同时”(真并行),取决于任务运行的环境:是否有多核CPU或者多CPU。
如果运行环境是单核单CPU,那么显然不可能是 “真并行”,那么OS会通过为各个任务分配CPU时间片的方式,交替执行各个任务,只不过这个交替的速度很快,人类感觉不到这种交替切换,所以就感觉上各个任务似乎也在 “同时” 执行(伪并行,此时是并发)。
2、同步、异步:程序员编程视角
(1)同步:让各个任务依次被执行,各个任务被运行的时间上没有重叠,即上一个任务执行完毕后,才可以执行下一个任务,即同步中没有 “并发” 甚或 “并行” 的概念。
至于多线程时是否可以同步?即有多个任务,每个任务起一个线程,是否仍然可以实现同步?显然是可以的,具体见参考4。
(2)异步:相对于同步,一个任务无需等待上一个任务执行完毕 就可以被执行。这种任务执行编程范式就叫异步。
那么从CPU视角看,异步中多个任务被执行的方式,类似 “同时” 执行了多个任务,即并发。
个人理解与 并发 的区别是:并发强调让任务 “同时” 执行(不论是真同时,还是感觉上同时),但是异步不强调 “同时”。例如,正在被CPU执行的任务一可以被任务二打断,在并发环境下,任务二的时间片用完后,就必须将CPU交给任务一了,任务一继续被执行,任务一时间片用完后,就需要把CPU交给任务二了,这样快速交替下去,让人感觉,这两个任务似乎在同时执行;而在异步下,任务二在打断任务一后,可以一直被执行下去,不用考虑是否做到 让人类觉得 “同时” 在执行两个任务,即任务二可以一直执行下去,当然是否需要让任务二一直执行下去,视业务需要。
参考:
1、一个视频告诉你“并发、并行、异步、同步”的区别_哔哩哔哩_bilibili
3、并发、并行、同步、异步的概念_郑*杰的博客-CSDN博客_同步并行