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

并发(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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在C#中,有多种方法和类可以实现并发编程,以下是一些常用的相关类和技术: 1. 多线程编程: - Thread 类:用于创建和控制线程的基本类。 - ThreadPool 类:用于管理线程池,可以重用线程以提高性能。 - Task 类:用于创建和管理异步操作的任务。 - Parallel 类:提供了一组静态方法,用于并行执行循环、迭代和任务。 2. 同步和互斥: - Monitor 类:提供了一种基于锁的同步机制,用于保护共享资源的访问。 - Mutex 类:提供了一种系统级别的互斥锁,用于同步跨进程的线程访问。 - Semaphore 类:提供了一种计数信号量,用于控制对特定资源的访问。 3. 并发集合: - ConcurrentQueue、ConcurrentStack、ConcurrentBag 类:线程安全的队列、栈和无序集合。 - ConcurrentDictionary 类:线程安全的字典。 4. 并行 LINQ(PLINQ):使用并行化技术对 LINQ 查询进行并行执行,提高查询性能。 5. 异步编程:使用 async/await 关键字结合 Task 和 Task<T> 类来实现异步操作,并避免阻塞主线程。 6. 并发设计模式:例如生产者消费者模式、读写锁模式、信号量模式等,用于解决特定的并发编程问题。 在并发编程中,需要注意线程安全性和竞态条件等问题,使用适当的同步机制和并发类来保护共享资源的访问。此外,正确处理异常和避免死锁等问题也是并发编程中需要考虑的重要方面。 总结: C#提供了多种类和技术来实现并发编程,包括多线程编程、同步和互斥、并发集合、并行 LINQ、异步编程等。通过这些类和技术,可以有效地管理线程、保护共享资源,并提高程序的并行性和性能。在并发编程中,需要注意线程安全性和竞态条件等问题,并采用适当的设计模式和同步机制来解决这些问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值