前提
java内存模型规定了所有的变量都存储在主内存(Main Memory)中,
每个线程还有自己的工作内存,工作内存中保存了该线程使用 的变量的主内存副本;
线程对变量的所有操作,都必须在工作内存中进行,而不能直接读写主内存中的数据
volatile变量也依然需要进行工作内存的拷贝
此处的变量不包括局部变量和方法参数,因为这些是线程私有的,并不参与竞争;
内存间的交互操作
Java内存模型中定义了以下8中操作来完成,
java虚拟机实现时必须保证下面的8中操作每一种都是原子的、不可再分的(double long 的读载存取例外)
-
lock(锁定):
作用域主内存的变量,它把一个变量表示为一条线程独占的状态
-
unlock(解锁):
作用于主内存的变量,它把一个处于锁定状态的变量释放,释放后的变量才能被其他线程锁定
-
read(读取):
作用于主内存中的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便之后的load
-
load(载入)
作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
-
use(使用)
作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量值的字节码指令时会执行这个操作
-
assign(赋值):
作用于工作内存中的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时,会执行这个操作
-
stroe(存储):
作用工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作
-
write(写入)
作用于主内存中的变量,它把store操作从工作内存中得到的变量值放入主内存中.
Java内存模型还规定了执行上面8中操作时必须满足的规则:
- 不允许read 、load、store、write操作之一单独出现
- 不允许一个线程丢弃它最近的assign操作
- 不允许一个线程在没有发生任何assign操作的前提下,把数据从线程的工作内存同步回主内存
- 一个新的变量只能在主内存中创建,不允许在工作内存中直接使用一个未被初始化的对象
- 如果对一个变量执行lock操作,则会清空工作内存中此变量的值
- 如果一个变量事先没有被lock,则不允许被unlock
- 对一个变量执行unlock操作之前,必须先把此变量同步回主内存中