JAVA多线程与多进程

并发与并行是两个既相似而又不相同的概念,但往往容易混为一谈,这两者究竟有什么区别呢?本文通过一个例子让你更好地理解(本文由并发编程网翻译)。

现代社会是并行的:多核、网络、云计算、用户负载,并发技术对此有用。

Go语言支持并发,它提供了:并发执行(goroutines),同步和消息(channels)和多路并发控制(select)。

并发和并行的区别

当Go声称是并发时,人们说:“并发很酷!耶,我可以并行运行了!”,但这是个错误的。因为很多人都不了解他们间的差别。“我用四个处理器来做质数筛选,但是更慢了。”

并发(Concurrency):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)

并行(Parallelism):以可同时执行的(可能相关的)计算指令方式编程。

两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。不同,但也相关。一个是关于代码结构,一个是关于代码执行。并发为可能的(不是必须的)并行问题提供了一种解决方案。比如:

鼠标、键盘、显示器、磁盘驱动是并发结构的。

向量点积是并行的。

并发带有通信

并发是一种构造程序的方式,把任务分解为一个个独立运行的小任务。通信是协调这些小任务的手段。

Go 的模型(还有Erlang等)都是基于CPS(Communicating sequential processes,通信顺序进程):其论文C. A. R. Hoare: Communicating Sequential Processes (CACM 1978)

通过一个例子来理解

以上讲得太抽象了,我们举实际点的例子。

我们的问题:把一堆废弃语言的说明书运到火炉里,一只地鼠会花费很长时间。

JAVA多线程与多进程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpfzw.html