您的位置:首页 > 编程语言 > Java开发

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

2016-08-02 15:28 399 查看
并发(Concurrent)与并行(Parallel)是一个大家比较容易混淆的概念。大家在解释并发与并行的时候一般这样说:

多线程是并发执行的;

多核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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息