Java并发编程三:并发(Concurrent)与并行(Parallel)的区别(一)

来源:互联网 发布:mac android ndk 下载 编辑:程序博客网 时间:2024/06/05 00:20

并发(Concurrent)与并行(Parallel)是一个大家比较容易混淆的概念。大家在解释并发与并行的时候一般这样说:

  1. 多线程是并发执行的;
  2. 多核CPU是并行执行的,单核CPU是不可以不行执行的;

以上说法也是可以理解的,大家都是基于场景来描述的。为了搞清楚这个问题,我查阅了一些资料,发现这篇译文:并发不是并行,它更好中的图片很好的说明了并发与并行的区别。

定义

网络上找到的定义如下:

并发(Concurrent):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)。

并行(Parallel):以可同时执行的(可能相关的)计算指令方式编程。

我的理解:

并发(Concurrent):是一种构造程序的方式,把任务分解为一个个独立运行的小任务。通信是协调这些小任务的手段。

并行(Parallel):以分组的方式,同时执行每一组并发任务。

两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。

以上的讲解太抽象了,我们通过实例来讲解,举例如下:

我们的问题:把一堆废弃的说明书运到火炉里,一只地鼠会花费很长时间。

方案一

一只地鼠,使用一辆推车,将书装到车上,运输到火炉旁,将书卸到火炉。

这里写图片描述

方案二

有两只地鼠,一只地鼠,使用一辆推车,将书装到车上,运输到火炉旁,将书卸到火炉。另一只地鼠出于等待中,显然增加更多的地鼠是无法解决效率问题的,也需要同时增加推车。(当然有人说两只地鼠轮流使用一辆推车,这样可以让地鼠得到休息,这样它们干活更快,也可以提高效率。)

这里写图片描述

方案三

两只地鼠,两辆推车,分别使用各自的推车,将书装到车上,运输到火炉旁,将书卸到火炉。这样会提高运输效率,但它们会在装书和卸书时进行排队,降低了效率。

这里写图片描述

方案四

基于方案一的改进,将书堆拆分成两部分,同时增加一个火炉。该方案有两种可能:
1、只地鼠运一次上面那堆书,然后第二只地鼠再运一次下面那堆书。一次只允许一只地鼠运送,这样就不是并行的。
2、两只地鼠,两辆推车,分别使用各自的推车,把各自书堆的书装到车上,运输到各自的火炉旁,将书卸到火炉。这样提高了运输效率,而且在装书和卸书时不会进行排队,提高了装卸的效率。

这里写图片描述

方案五

三只地鼠在工作,一只负责把书装到车上,一只负责运输,一只负责把书卸到火炉。每只地鼠做一个独立的任务。
这里写图片描述

方案六

四只地鼠在工作,一只负责把书装到车上,一只负责运输,一只负责把书卸到火炉,一只负责运回空推车。每只地鼠做一个独立的任务。
这里写图片描述

观察结论:我们在一个已有的设计(指三个地鼠的那个设计)中添加一个并发的步骤(第四只地鼠)增强了系统的性能。更多的地鼠干了更多的活,系统运行得更好。并发比简单的并行对问题要有更深的洞察。

我们有四个并发的步骤:

 1. 把书装到车上; 2. 把推车运到火炉旁; 3. 把书卸到火炉里; 4. 运回空推车。

不同的并发设计能以不同的方式来并行。

方案七

增加一个方案六的分组,使两个分组并行执行。

这里写图片描述

方案八

两只地鼠,再加上一个中转堆。这也是一种用并发来解决问题的方案。

这里写图片描述

方案九

增加一个方案八的分组,使两个分组并行执行。

这里写图片描述

方案十

在多地鼠并发模型中引入中转堆

这里写图片描述

方案十一

增加一个方案十的分组,使两个分组并行执行。

这里写图片描述

总结

我们有很多方法把问题分解,这才是并发设计。一旦我们分解了问题,并行就自然而然的产生了。

回到两者的区别这个问题上:

并发是同时处理(dealing)很多的事情,如方案六,同时处理一下四个并发步骤:

 1. 把书装到车上; 2. 把推车运到火炉旁; 3. 把书卸到火炉里; 4. 运回空推车。

并行是同时做(doing)很多的事情,如方案十一,分为两组同时执行任务。这就是我对并发与并行的理解。

参考资料

并发不是并行,它更好!
并发(Concurrent)与并行(Parallel)
关于Java并发编程的总结和思考
Java concurrent Framework 基础知识之进程管理
Concurrent Programming in Java

1 2
原创粉丝点击