java内存模型
Posted chen--biao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内存模型相关的知识,希望对你有一定的参考价值。
为何需要java内存模型(Java Memory Model,JMM):
用于屏蔽各种操作系统和硬件之间的内存访问差异,使得java能够在各种平台下能够达到一致的运行结果。
java内存模型(虚拟机内存):
1、主内存:所有的变量都存储在主内存。(线程私有的变量,不存在主内存中)
2、工作内存:线程的工作内存保存了该线程使用到的变量的主内存副本拷贝。
两者的工作方式:
线程对变量的所有操作(读取,赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程中的工作内存,相互独立,无法直接访问。线程见变量的传递都需要通过主内存来完成。
线程 1<--(直接操作)--> 工作内存 <--(读写)--> 主内存
线程 2<--(直接操作)--> 工作内存 <--(读写)--> 主内存
内存间交互操作:
1、lock(锁定):作用于主内存变量,它把一个变量标识为一条线程独占的状态。
2、read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
3、load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
4、use(使用):作用于工作内存的变量,它把工作内存中的变量传递给执行引擎。
5、assign(赋值):作用于工作内存的变量,它将执行引擎返回的结果,赋值给工作内存中的变量。
6、store(存储):作用于工作内存的变量,它把工作内存中的变量传送到主内存中,以便随后的write操作使用。
7、write(写入):作用于主内存的变量,它把store操作传递过来的变量值放入主内存中。
8、unlock(解锁):作用于主内存的变量,它把处于锁定的变量,释放出来。被释放的变量,才能被其他线程锁定。
规则:
1、read/load、store/write必须成对。
2、assign之后,必须执行store/write,即不能丢弃assign的变量。
3、未assign的变量,不允许store/write,即不能将未修改的变量,回写到主内存。
4、一个变量,只允许一次lock。只有被unlock的变量,才能被其它线程lock。
以上是关于java内存模型的主要内容,如果未能解决你的问题,请参考以下文章