02-理解多线程与并发之间的联系与区别

多线程和并发之间到底有什么关联呢?它们之间又有哪些差异呢?我们本节课就来探讨一下。

首先说一下什么是多线程,其实之前已经给大家讲了一个非常简单的例子了

假如这是我们的一个应用,假如我们在这里面写代码

我们知道,程序是一行一行的往下执行的,在Java虚拟机运行时内存区域中,有一块叫做PC寄存器,类似于代码编辑器中的linenumber,指示的是行号,Java虚拟机就跟着行号一行一行的往下执行。

肯定不会说从执行完int a = 10; 之后,接着先执行int c = a + b; 然后再回过头去执行int b = 20; 这是绝对不可能的,这就是单个线程在执行,就是说,这里面的代码是一行一行的往下去执行的,不会乱序去执行,我们知道,在运行这段代码的同时

当然这段代码不会,比如说运行一个非常复杂的代码的过程中,我们知道,Java的内存管理,我们并不需要手动的去管理内存,Java提供了自动内存管理机制,内存的申请和释放都是由Java虚拟机来自己完成的,那么,在进行垃圾回收的过程中,就需要调用垃圾收集器(GC),那么,你这个程序在运行的过程中,垃圾收集器也是在工作的,我们发现,我们并不知道垃圾收集器在工作,但是,垃圾收集器却是已经在工作了,怎么回事呢?其实,有另外一个线程在执行垃圾收集器,就是专门的垃圾收集器线程,它里面也有一行一行的垃圾收集代码

那么,在我们程序运行的过程中,这些代码会自动的悄悄的往下去执行。Java虚拟机中的内存区域,我们这里不去详细的说,主要分为两大区域,一个是线程共享区,一个是线程独占区,我们知道,堆和方法区是被线程所共享的区域,就是所有的线程共享这块区域,除了这两块区域以外,还有程序计数器

这块区域是被线程所独享的,也就是说每个线程都有这么一块区域,因此,这两个各自都有各自的程序计数器

这两个之间是互不干扰的,也就是相当于有两段代码在同时的进行,这就是多线程,关于Java虚拟机的内存模型,可以参考我的《深入理解Java虚拟机》。

那么,我们自己能不能创建多个线程呢?当然也是可以的,我们可以任意的创建多个线程,只要我们当前的硬件环境能够支持,我们可以任意创建很多个线程。

我们说,每一个线程就是一个顺序执行流,“顺序执行流”非常好理解,看着它像流水一样往下执行,这就是一个流,那么,它是怎么执行的呢?它是按顺序执行的,一个线程就是一个顺序执行流,那么所谓的多线程就是多个顺序执行流。

然后我们接着说并发的问题,多线程和并发到底有什么关系呢?并发就是并行的执行,是不是跟多线程非常的类似呀,那么,多线程是不是就是并发呢?其实不是,从广义上来说,我们可能就认为多线程就是并发,但是,实际上多线程不是并发,我们可以这么去想。我们知道Java代码最终会被翻译成字节码,那么,字节码文件里面都是字节码指令,我们Java虚拟机运行,其实运行的就是字节码指令。Java运行肯定是离不开Java虚拟机的,那么,我们想深入的研究并发,也会不断的去了解Java虚拟机的一些运行时过程,我们刚才说字节码,说源码会被编译成字节码,那么我们Java虚拟机执行的就是字节码指令,那么,它在执行过程中,是由谁执行的呢?其实,它最终又交给了我们的操作系统去执行,我们目前就先不管这些事,其实最终是运行在CPU上面的,那么,比如说,我们说,我们当前这个CPU

也就是说,双核四个线程,那么,我们能不能创建5个线程呀?能不能创建6个线程?能不能创建100个线程?显然是可以的。它其实并不是由CPU的核数来决定的,即使是就只有一个CPU核心,那么,它同样的也能够创建多个线程,那么,我们现在先不说多核的问题,就说一个CPU核心,那么,一个CPU核心也能够创建多个线程,那么,多个线程也是同时在执行的,那么,它是怎么做到的呢?画个图解释一下

假设这是一个炉子,那么,这个炉子是干什么的呢?假设这个炉子是用来考烧饼的

假设这些是炉子上面放的烧饼。

这个炉子的下面,有一个火炉

假设这个炉子在不停的转,那么,当转到火炉上面的时候,对应的这个火炉上面的烧饼才开始烤,那么这个烧饼其实就是我们的线程,而,下面的这个火炉是我们的CPU

当炉子在转的非常快的时候,我们说,任务的切换线程之间的切换时间就会非常的短,那么,我们就会看起来像是在同时执行,但是,其实并不是在同时执行,它是在不停的切换的,就类似于,图片切换的频率非常高的时候,就成了动画,就成了视频,也是这个道理,线程任务切换的非常快的时候,那么我们就认为它是在不间断的执行的,这个原理其实也类似于我们的灯泡,灯泡其实也是在不停的闪的,我们看到灯泡一直亮,就是因为它闪的频率非常的高,这就是多线程,多线程其实并不是多个线程一起执行而是线程之间因为切换的速度非常的快,所以,我们看起来像不间断的执行

那么,并行又是什么呢?并行就不一样了,并行表示的是多个任务同时执行,就是说,这么多的烧饼在一块烤,那怎么做到的?有多个炉子就可以做到了。每个烧饼下面有一个炉子,这样就能做到一块烤了,这就是所谓的并行,那么,并发和多线程之间其实通过这个例子就可以看的非常清楚了,多线程并不一定是并发,如果是并发执行,那么肯定是多个线程在一块执行,当然也未必,多个进程也是并发执行。

这就是多线程和并发之间的关系。

猜你喜欢

转载自blog.csdn.net/G_66_hero/article/details/85251207