JVM笔记:Java内存模型

Java虚拟机规范中,试图定义一种Java内存模型来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。

定义Java内存模型并不是一件容易的事情,这个模型必须定义的足够严谨,才能让Java的并发内存访问操作不会产生歧义;但是,也必须定义的足够宽松,使得虚拟机的实现有足够的自由空间去利用硬件的各种特性来获取更好的执行速度。

主内存与工作内存

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

Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

线程、主内存、工作内存三者的交互关系如下图所示:

内存间交互操作

关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java内存模型定义了一下8个操作来完成,虚拟机必须保证下面提及的每一种操作都是原子的、不可再分的。

如果要把一个变量中主内存复制到工作内存呢,那就要顺序的执行read和load操作,如果要把变量从工作内存同步回主内存,就要顺序的执行store和write操作。

除此之外,Java内存模型还规定了在执行上述8种基本操作时必须满足如下规则:

这8种内存访问操作以及上述规则限定,再加上对volatile的一些特殊规定,就已经完全确定了Java程序中哪些内存访问操作在并发下是安全的。