四、内存模型(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的变量和主内存的变量值就保持一致了。