主内存与工作内存
Java内存模型的主要目标是定义程序中各个变量的访问规则。即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。这里的变量和Java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素。但不包括局部变量和方法参数。
Java内存模型规定了所有的变量都存储在主内存中,每条线程都有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
线程、主内存和工作内存三者的交互关系如图所示:
内存间交互操作
关于主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的细节,Java内存模型定义了一下8中操作来完成。虚拟机实现时必须保证下面体积的每一种操作都是原子的、不可再分的。
1、 lock:作用于主内存的变量,它把一个变量表示为一条线程独占的状态。
2、 unlock:作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
3、 read:作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的loadd动作使用。
4、 load:作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
5、 use:作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
6、 assign:作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
7、 store:作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
8、 write:作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。
volatile的语义
1、 保证此变量对所有线程的可见性
2、 禁止指令重排序优化