并发(Concurrent) 与并行(Parallel) 的区别

刚开始阅读 《Akka IN ACTION》这本书,刚开始是对 Revolution 这个词翻译成中文是革命 感到诧异,因为革命 通俗来讲就是 杀人 的意思。至于 Revolution 英文解释不深究了,只是感叹何以颠覆性的变化就一定要杀人吗?

也由此引出了编程中经常面对的 Concurrent(名词为:Concurrency) 和 Parallel(名词为:Parallelism) 这两个词,基本上是认为它们是同一个意思。其实不然,下面慢慢道来。

如果从英文字典对它们的解释也没有多大区别,差不多都是说同是发生,但字面上 Parallel 多了一个平行的意思。所以在中文上,在计算机领域我们约定的翻译是

  • Concurrent(Concurrency)  --  并发
  • Parallel(Parallelism)           --  并行

比如在多线程环境中它们的区别具体体现在:

并发:多个任务在同一个 CPU 核上按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。针对 CPU 内核来说,任务仍然是按细粒度的串行执行。也难怪在 Java 5 中新加的并发 API 的包名是 java.uti.concurrent

并行:区别与串行,多个任务真正的分配到不同的 CPU 内核上去执行的,它们是真正的同时执行。注意到 Java 8 的  Collection 除了 stream() 方法外,还有个方法名字叫做  parallelStream(), 为什么它是 parallel 呢?因为它使用的线程池是 ForkJoinPool.commonPool, 而这个池的大小是 CPU 内核数减一,主线程已经占了一个核,希望 的是 parallelStream() 中每个任务都能理想的分配到不同的 CPU 内核上去并行执行。

更通俗一点的类比,并发是四辆汽车在同一个车道上跑; 并行是单向四车道,四辆车在各自的车道跑,彼此不受影响。

类似的概念也应用到了 sbt 或 Maven 执行所有测试用例的行为上,基于不同的配置:

  • 测试并发执行 -- 所有测试用例逻辑上在同一个 JVM 上执行,默认行为好像就是这样的
  • 测试并行执行 -- 所有测试用例可进行分组跑在多个的 JVM 上,更大程度上节约了测试时间

链接:Concurrency VS. Parallelism

本文链接 https://yanbin.blog/different-between-concurrent-and-parallel/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

2 Comments
Inline Feedbacks
View all comments
Yijun Yuan
Yijun Yuan
6 years ago

奉天承命,这里的命可不是指的某一个人,所以革命不是杀人的意思