知足常乐 俭以养德
并发意味着在重叠的时间周期内,多个任务以无序的方式启动,运行及完成。并行则是多个任务或者某一任务的不同部分以字面意思同时运行,比如在一个多核的处理上运行。记住,并行和并发不是一件事。
让我们深入的了解一下我所说的并发和并行。
并发本质上应用于我们所讨论的最少两个任务或多任务。当一个应用可以几乎同时地执行两个任务,我们说它是并发程序。虽然两个任务看上去同时运行,但实际上可能并不是。它们利用操作系统CPU时间片的特性,运行任务的一部分,然后进入等待状态,当第一个任务进入等待状态,CPU被分配给第二个任务来完成它的特定部分。
基于优先级的操作系统,分配CPU和其他计算资源例如内存,轮流执行所有的任务,从而让这些任务有机会完成。对于最终用户来说,看起来所有的任务在并行运行。这就叫做并发。
并行并不一定需要存在两个任务,借助于多核架构CPU,它将每个核分配给一个任务或子任务,从而实现物理地同时运行任务的多个部分或多个任务。
实际上,并行依赖多处理单元的硬件支持。而用单核CPU,你可能能得到并发,但是不可能得到并行。
现在,让我们列出两个最明显的不同:
并发两个任务在重叠的时间周期内启动,运行及完成
并行是任务真实地同时运行,例如在多核处理器上。
并发是各独立执行过程的组合,而并行是同时执行的(可能有关)的计算。
并发是一次能处理多件事情,而并行是一次做多个事情。
如果一个应用程序是并发但不是并行,那么意味着它虽然可以处理多个任务,但是在某一个时间点任务并不是同时运行
如果一个应用程序是并行但不是并发,那么意味着它在多核的CPU中同时执行某一任务的多个子任务。
如果一个应用程序既不是并行也不是并发,那么意味着在每个时间点顺序执行一个任务
如果一个应用程序既是并行又是并发,那么意味着它利用多核同时执行多个任务
以上就是并发和并行,在java多线程中一个非常重要的概念
译者注:
根据作者的表式,并行和并发的核心区别就是并行是真的有多核/CPU在运行多个任务,而并发则是某个时刻只有一个任务在执行。作者在文章里还区别了任务和子任务,感觉不是很有必要,这只是划分粒度的不同,你认为的子任务在别人眼里可能就是任务。引入任务和子任务反而引起更多的困惑。大家可以参考这片知乎文章:https://www.zhihu.com/question/33515481 比较同意观点:
李遥:
不要把事情说得那么复杂:
并发就是指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行
并发指的是代码的性质,并行指的是物理运行状态
黑板客
并发是指同时有很多事要做,你可以串行处理也可以并行处理。
并行是指同时做多件事。
因此并发和并行是相关的,但是是不同的两个概念