并发与并行,进程与线程的解析

无论是那种语言,在编程中都会遇到并发,并行问题,进而牵扯到线程,进程。之前一直有所疑惑,现在进行一些梳理。

并发,并行的一个比喻

知乎上看到一个形象的比喻

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

可以从这个例子看出,并发,并行的根本区别,是同时

线程,进程

进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
一个车间里,可以有很多工人。他们协同完成一个任务。线程就好比车间里的工人。一个进程可以包括多个线程。
CPU同时刻只能执行一个进程,多核CPU当然就可以同时刻执行多个进程

Java中的并发与并行

如上并行的关键在于同时,比如机器,我们知道是有多核CPU的,但是比如JVM启动后是占用一个进程的,而线程是共享的进程资源,那么多核CPU就浪费了?并不是。
在windows和linux里,Java线程与操作系统的线程映射关系是这样的一对一。所以说线程可以利用多核CPU。
并发与并行,进程与线程的解析