对于并发环境下的线程工作内存与主内存同步实现, Java内存模型定义了8种内存操作来完成:
1. lock:主内存操作,锁定变量,标识其为线程独占的状态。
2. unlock:主内存操作,解锁变量,将其从线程独占的状态中释放出来。
3. read:主内存操作,读取变量到工作内存。
4. load:工作内存操作,将读取到的变量赋值给工作内存中的变量副本。
5. use:工作内存操作,将变量值传递给执行引擎以供操作。
6. assign:工作内存操作,将执行引擎操作后的值赋给工作内存中的变量。
7. store:工作内存操作,将工作内存中的变量传递给主内存。
8. write:主内存变量,将store得到的值写入主内存中的变量。
对于以上8种内存操作,Java内存模型要求为原子的,不可再分的。不过也有特例,对于long和double这种64为的基础数据类型,在某些平台上,read、load、store、write操作可以拆分成2次32位的操作。这种情况在实际应用中基本不用考虑,因为大部分情况下JVM都会将其当做原子操作处理。
Java内存模型对这8种内存操作定义了以下使用规则:
1. read和load,store和write必须成对出现,即工作内存或主内存必须将已经从另一方读取到的值写入自己所持有的变量,不允许拒绝。
2. 工作内存最后一次assign必须同步回主内存,而工作内存同步回主内存的变量也必须执行过assign操作。
3. 工作内存不可以使用未初始化的变量,即use之前必须要有load,store之前必须要有load和assign。
4. 一个变量只能由一个线程lock,也只能由这个线程unlock,线程可以多次lock,对应的解锁需要同样次数的unlock。
5. 不允许unlock未被lock过的变量,且unlock操作必须在store和write之后。
参考文献:
《深入理解Java虚拟机:JVM高级特性与最佳时间》,第2版,周志明