目录
一、什么是JMM
java内存模型( Java Memory Model),屏蔽硬件和操作系统的内存访问差异,实现java程序在各种平台下都能达到内存访问一致。
二、JMM的作用
JMM实现缓存一致性协议,定义了程序中变量的访问规则。这里的变量指的是实例字段,静态字段,构成数组对象的元素,不包括局部变量和方法参数,因为这些是线程私有的。
三、线程,工作内存,主内存的关系

a、变量都存储在主内存中。
b、每条线程有自己的工作内存,工作内存中保存了该线程使用的变量的主内存副本。
c、线程对变量的操作(读取,赋值等)都在工作内存中进行,不能直接读取主内存中的变量。
d、线程之间无法直接访问对方工作内存中的变量,且线程间变量的传递必须通过主内存来完成。
四、主内存与工作内存交互(8种操作)
指的是变量怎样从主内存拷贝到工作内存,又从工作内存同步到主内存的过程。

a、lock(锁定):作用于主内存变量,将其标识为一条线程独有的状态。
b、unlock(解锁):作用于主内存变量,将其从锁定状态释放出来,释放后才能被其他线程锁定。
c、read(读取):作用于主内存变量,将主内存中的变量读取到工作内存。
d、load(载入):作用于工作内存变量,把读取到的主内存变量加载到工作内存的变量副本中。
e、use(使用):作用于工作内存变量,把工作内存的变量的值传递给执行引擎去使用。
f、assign(赋值):作用于工作内存变量,把执行引擎返回的结果赋给工作内存的变量。
g、store(存储):作用于工作内存变量,把工作内存中变量的值传递给主内存。
h、write(写入):作用于主内存变量,把从工作内存传递的值赋给主内存的变量。
在执行上述8种操作的时候必须满足以下条件:
a、不允许read和load,store和write操作之一单独出现。即不允许一个变量从主内存读取了,但工作内存不接受;工作内存发起了回写但主内存不接受。
b、不允许线程丢弃最近的assign操作,即变量在工作内存中发生变化后,必须把该变化同步回主内存。
c、不允许线程把没发生过任何assign操作的变量同步回主内存。
e、新的变量只能从主内存中诞生,不允许工作内存使用没经过load,assign操作的变量。
f、一个变量同一时刻只能被一条线程进行lock操作,lock操作可以执行多次,想要解锁必须执行同等数量的unlock。
g、对一个变量执行lock操作,将会清空工作内存该变量的值;执行引擎使用该变量前必须重新执行load或者assign操作以初始化该变量的值。
h、一个变量没有被lock操作锁定,就不允许执行unlock操作,也不允许unlock一个被其他线程锁定的变量。
i、对一个变量执行unlock操作之前,必须把该变量同步回主内存。

被折叠的 条评论
为什么被折叠?



