Java BlogJava 杂谈程序园

Java内存模型

2019-05-28  本文已影响0人  爪哇部落格

\color{red}{码字不易,欢迎大家转载,烦请注明出处;谢谢配合}

主内存与工作内存

Java虚拟机规范试图定义一种Java内存模型(Java Memory Model,JMM) 来屏蔽硬件和操作系统的内存访问的差异,以实现Java在不同平台都能达到一致的内存访问效果。

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存以及从内存中取出变量的底层细节。

Java内存模型规定所有的变量都存储在主内存,每个线程都有自己的工作内存,线程的工作内存中保存着本线程使用变量的主内存数据副本;线程对变量的所有操作(读取,复制)都在工作内存中进行,不能直接在主内存中进行;并且线程之间是相互隔离的,一个线程不能访问其他线程工作内存的变量;线程之间的变量值传递都需要通过主内存来传递;可以参考以下示意图:

线程,工作内存,主内存交互关系.png

内存间交互

工作内存与主内存之间具体的交互协议,即具体的主内存复制到工作内存,工作内存同步到主内存的实现细节,Java内存模型定义了8种操作来完成:

Java内存模型同时还规定了8种操作必须满足以下规则:

1.read-load,store-write 指令,不能单独出现,并且还需要满足顺序性
2.线程变量assign后,必须同步给主内存
3.不允许无原因的进行同步操作,即没有工作内存执行assign操作,而发起向主内存的同步
4.新的变量只能在主内存中诞生
5.一个变量同一时刻,只允许一个线程lock
6.变量没有执行lock,不允许执行unlock
7.执行unlock前,必选先把变量值同步给主内存
8.lock变量时,会清除工作内存变量值,在执行引擎使用变量前要重新load或assign

基于理解难度与严谨性考虑JSR133文档中,已经放弃使用这8种操作去定义Java内存访问协议(描述方式改变了,内存模型没有改变)

上一篇 下一篇

猜你喜欢

热点阅读