并发和并行这两个术语通常用于多线程程序。但并发和并行到底是什么意思,这两个术语又有什么不同呢?
我花了一些时间才最终理解并发和并行之间的区别。因此,我打算在本Java并发教程中添加一篇关于并发与并行的文章。
并发
并行
要实现真正的并行,应用程序必须运行多个线程,或者至少能够把任务安排在其他线程、进程、CPU或显卡等中执行。
并发与并行的详细对比
如你所见,并发与应用程序处理多个工作任务的方式有关。应用程序可以一次(顺序)处理一个任务,也可以同时(并发)处理多个任务。
而并行与应用程序处理每个单独任务的方式有关。应用程序可以从头到尾连续地处理任务,或者将任务拆分成可以并行完成的子任务。
如你所见,应用程序可以是并发且非并行的。这意味着它同时处理多个任务,但线程一次只执行一个任务。不存在并行线程或CPU中并行执行的任务。
应用程序也可以是并行且非并发的。这意味着应用程序一次只能处理一个任务,并且该任务被分解为可以并行处理的子任务。但是,每个任务(以及子任务)要先完成,才能再拆分和并行执行下一个任务。
此外,应用程序可以是非并发且非并行的。这意味着它一次只能处理一个任务,并且任务也不会分解为并行执行的子任务。
最后,应用程序也可以既是并发又是并行的,因为它既同时处理多个任务,又将每个任务分解为并行执行的子任务。但是,在这种情况下,并发和并行可能不会带来什么好处,因为计算机中的CPU光是处理并发或者并行就已经够忙的了。两者结合起来可能只会带来很小的性能提升甚至性能损失。在盲目采用并发并行模型之前,一定要先进行分析和度量。