Java并发编程(Java Concurrency)(6) - 并发 vs. 并行(Concurrency vs. Parallelism)

来源:互联网 发布:修改telnet端口 编辑:程序博客网 时间:2024/06/06 01:01

原文链接:http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html

   摘要:这是翻译自一个大概30个小节的关于Java并发编程的入门级教程,原作者Jakob Jenkov,译者Zhenning Lang,转载请注明出处,thanks and have a good time here~~~(希望自己不要留坑)

并发 vs. 并行(Concurrency vs. Parallelism)

当涉及多线程的程序时,并发(concurrency )和并行(parallelism)经常被谈及。但究竟二者的确切定义是什么,他们是相同含义的吗?

盖棺而论是“不相同”。虽然二者表面上相似,但他们本质上是不同的。我也花了一些时间才弄明白这一点,因此我决定在正式介绍编码内容前增加这样一个话题的讨论 - 并发和并行的异同。

并发(Concurrency)

“并发”意味着一个应用程序在同一时间(并发地)处理多于一个任务。当然如果仅有一个CPU那么应用程序并不是真正的并发处理多任务,但这里的并发指的是程序不用在开始处理新的任务之前等待尚未完成的任务被处理完成。

并行(Parallelism)

“并行”意味着一个应用程序将其要完成的(一个或多个)任务分割成更小的子任务,并且这些子任务可以并行的被处理,例如这些子任务可能是在多个CPU中同时被处理。

二者区别的细节

显而易见,并发处理的是如何协调多个任务。应用程序既可以选择在单一时间内只处理单一的任务(串行的),也可以选择在单一时间内处理多个任务(并发的)。

而另一方面,并行处理的是该如何划分任务。应用程序既可以串行的将一个任务从头执行到尾,也可以将其分割成许多子任务并且并行地完成。

那么,一个应用程序可以是并发的,而不是并行的。这意味着这个程序同时处理着多个任务,但各个任务并没有被划分为更小的子任务。

一个应用程序也可以是并行的,而不是并发的。这意味着程序同一时间处理了单一的任务,而且任务并分割为更小的子任务,子任务被并行的执行。

一个应用程序更可以是既非并行的,也非并发的。这种情况是程序执行了一个任务并且任务也没被并行化。

最后,一个应用程序当然可以是既并行又并发的,即又同时执行多个任务,又划分任务为并行执行的子任务。然而,此时可能会损失并发或并行的优点!这是因为CPU单独处理并行或并发已经焦头烂额,同时应用两者比单独应用其一可能只能产生很小的性能增益甚至带来性能衰减。请不要盲目的使用这些模型。

译者注:我觉得并行肯定是并发的… 因为 Concurrency 就是指同时运行的意思,但咬文嚼字没什么意思,理解原作者想表达什么就好。

0 0
原创粉丝点击