简介

在现代程序中,我们经常会使用到两个关键词:并发concurrency和并行parallelism,虽然两者的英文单词区别很大,但是翻译成中文之后几乎是一样的。虽然中文以其优美的语法和工整的写法凌驾于英语之上,但是带来的复杂性和翻译的多意性往往会给技术工作者一点点烦恼。

没关系,今天本文为大家解密一下并发和并行的联系和区别。

注意,本文所讲的并发和并行的概念都是指在同一个应用程序中。

并发和并行

事实上除了并发concurrency和并行parallelism,还有2个状态:并行执行Parallel Execution 和 并行并发执行 Parallel Concurrent Execution。接下来我们来分别讲解一下他们的区别。

并发concurrency

大家知道java中有一个非常有用的并发包叫做java.util.concurrent,里面有很多非常有用的类,用来处理多线程之间的资源竞争问题。根据并发包的作用,大家应该就可以猜到并发和并行的最大区别在于是否有资源抢占的情况。

我们来举个最近爆火的打新冠疫苗的例子,在本地没有确诊病例之前,大家都不慌着打疫苗,资源相对就比较多,不需要抢,所以不存在并发问题。

但是当一个地方出现了确诊病例之后,大家都慌了,于是抢着去打疫苗,造成了资源的紧张,于是产生了并发问题。

为了更好的描述这个并发问题,假设我们有10个人排成了两支队伍要去打疫苗,结果只有一个打疫苗的窗口。那么一个很可能的策略就是窗口交替给两个队伍的人打疫苗。我们做个图来表示:

<img src="https://img-blog.csdnimg.cn/20210527195139795.png" style="zoom:50%;" />

上图表示的就是并发concurrency的情况,一个窗口同时只能处理一个任务,所以两个队伍在争夺窗口这个资源。

资源争夺过程中会产生各种锁的问题,从而需要特别小心。

并行执行Parallel Execution

并行执行的意思是两个互相不干扰的任务同时进行。也就是说任务之间并没有资源的竞争关系,所以不会产生锁的问题。如果用在打疫苗的问题上,并行执行就是说现在有两个窗口,每个队列都可以分到一个窗口,不会产生竞争关系。

<img src="https://img-blog.csdnimg.cn/20210527200221921.png" style="zoom:50%;" />

并行执行是程序执行中最理想的情况,这种情况下资源是充足的,只需要考虑具体的业务逻辑即可,并不需要考虑他们之间的交互和资源占用关系。

并行并发执行 Parallel Concurrent Execution

并行并发执行的的意思就是在并行的过程中还存在着并发。以打疫苗的例子就是,现在有两个体育馆,每个体育馆都只有一个打疫苗的窗口,对于两个体育馆来说他们是并行的。但是对于每个体育馆中的每个窗口来说,又是并发执行的。

<img src="https://img-blog.csdnimg.cn/20210527200758968.png" style="zoom:50%;" />

并行并发执行状态应该是一般的应用程序中的基本状态。执行不同任务的线程是并行执行的,他们的资源是隔离的,所以互不影响。但是执行同一个任务的多个线程之间又是并发的,他们之间会抢占资源,所以需要进行并发控制。

并行parallelism

parallelism和Parallel翻译起来好像没有什么太大的区别,前面一个是专业的计算机名称表示并行性,后面一个可以用在任何地方,表示并行。

那么在计算机中,parallelism指的是什么意思呢?

其实它是指一个任务的可并行程度。比如5个人的打疫苗的任务,可以将5个人分成5个小组,每个小组都可以去争取自己的资源来执行,这其中可以并发也可以并行,这就是并行性parallelism的意思。我们用下面的图来表示:

<img src="https://img-blog.csdnimg.cn/20210527202048311.png" style="zoom:50%;" />

总结

讲了这么多,大家明白他们之间的区别了吗?

本文已收录于 http://www.flydean.com/05-concurrency-parallelism/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!


flydean
890 声望433 粉丝

欢迎访问我的个人网站:www.flydean.com