5. 架构之:并发和并行
简介
在现代程序中,我们经常会使用到两个关键词:并发concurrency和并行parallelism,虽然两者的英文单词区别很大,但是翻译成中文之后几乎是一样的。虽然中文以其优美的语法和工整的写法凌驾于英语之上,但是带来的复杂性和翻译的多意性往往会给技术工作者一点点烦恼。
没关系,今天本文为大家解密一下并发和并行的联系和区别。
注意,本文所讲的并发和并行的概念都是指在同一个应用程序中。
并发和并行
事实上除了并发concurrency和并行parallelism,还有2个状态:并行执行Parallel Execution 和 并行并发执行 Parallel Concurrent Execution。接下来我们来分别讲解一下他们的区别。
并发concurrency
大家知道java中有一个非常有用的并发包叫做java.util.concurrent,里面有很多非常有用的类,用来处理多线程之间的资源竞争问题。根据并发包的作用,大家应该就可以猜到并发和并行的最大区别在于是否有资源抢占的情况。
我们来举个最近爆火的打新冠疫苗的例子,在本地没有确诊病例之前,大家都不慌着打疫苗,资源相对就比较多,不需要抢,所以不存在并发问题。
但是当一个地方出现了确诊病例之后,大家都慌了,于是抢着去打疫苗,造成了资源的紧张,于是产生了并发问题。
为了更好的描述这个并发问题,假设我们有10个人排成了两支队伍要去打疫苗,结果只有一个打疫苗的窗口。那么一个很可能的策略就是窗口交替给两个队伍的人打疫苗。我们做个图来表示:
上图表示的就是并发concurrency的情况,一个窗口同时只能处理一个任务,所以两个队伍在争夺窗口这个资源。
资源争夺过程中会产生各种锁的问题,从而需要特别小心。