JVM学习之路(四)——内存模型(java多线程通信)

JVM学习之路(一)——java程序执行流程

JVM学习之路(二)——JVM的内部结构

JVM学习之路(三)——JVM内部结构详细介绍及其相互作用

四、内存模型(java多线程通信)

第三部分介绍了单个java程序是如何在JVM内部各个模块的协调配合下执行的,那么多个java程序呢?多个java线程之间的通信是怎么进行的呢?本部分解决的是这个问题。

一、首先明白2个概念:

  • 主内存:就是java堆,存放的是实例对象、数组元素等信息,java堆是线程共享的。
  • 工作内存:每一个线程自己私有的内存空间。

二、举个例子,线程1要向线程2通信,一定会经过类似的流程:

流程解读:

①线程1将自己工作内存中的X更新为1并刷新到主内存中;

②线程2从主内存读取变量X=1,更新到自己的工作内存中,从而线程2读取的X就是线程1更新后的值。

③从上面的流程看出,线程之间的通信都需要经过主内存。主内存与工作内存的交互,则需要Java内存模型(JMM)来管理

三、JMM是如何管理主内存和工作内存的:

流程解读1:当线程1需要将一个更新后的变量值刷新到主内存中时,需要经过两个步骤:

1、 工作内存执行store操作

2、 主内存执行write操作

完成这两步即可将工作内存中的变量值刷新到主内存,即线程1工作内存和主内存的变量值保持一致。

流程解读2:当线程2需要从主内存中读取变量的最新值时,同样需要经过两个步骤:

1、主内存执行read操作,将变量值从主内存中读取出来

2、工作内存执行load操作,将读取出来的变量值更新到本地工作内存的副本中去

完成这两步,线程2的变量和主内存的变量值就保持一致了。

猜你喜欢

转载自blog.csdn.net/u012556994/article/details/81261903