内存间的交互操作:一个变量如何从主内存拷贝到工作内存,如何从工作内存同步回主内存的实现细节,Java内存模型定义了8种操作来完成,虚拟机实现细节,Java内存模型定义了以下8种操作来完成:
- lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态
- unlock(解锁):作用于主内存变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
- read(读取):作用于主内存变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作的使用
- load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入到工作内存的变量副本中
- use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量值的字节码指令时就会执行这个操作
- assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时就执行这个操作
- store(存储):作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便随后write操作的使用
- write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中
如果要把一个变量从主内存赋值到工作内存,那就要顺序地执行read和load操作
如果要把变量从工作内存同步回主内存,那就要顺序地执行store和write操作
以上两个操作必须按照顺序执行,但是他们之间可以插入其他指令
执行上述8种基本操作时必须满足如下规则:
- 不允许read和load,store和write操作之一单独使用(意思是有read必须有load,有store必须有write),即不允许一个变量从主内存中读取了但是工作内存不接受,或者从工作内存写回但是主内存不接受的情况
- 不允许一个线程丢弃它的最近的assign操作,即变量在工作内存中改变了之后必须把该变化同步回主内存
- 不允许一个线程无原因地把数据从工作内存同步回主内存
- 一个新的变量只能从主内存诞生,不允许工作内存中直接使用一个未被初始化的变量
- 一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被同一线程重复执行很多次,只有执行相同次数的unlock操作,才会被解锁
- 如果对一个变量执行lock操作,那将会清空工作内存中此变量的值
- 如果一个变量事先没有被lock锁定,那么就不允许它执行unlock操作
- 一个变量在执行unlock操作之前,必须先把此变量同步回主内存中