【内存操作与内存屏障】
内存模型操作:
- lock(锁定) : 作用与主内存的变量, 它把一个变量标识为一条线程独占的状态
- unlock(解锁) : 作用于主内存变量, 它把一个处于锁定状态的变量释放出来, 释放后的变量才可以被其他线程锁定
- read(读取) : 作用于主内存的变量, 它把一个变量的值从主内存传输到工作内存中, 以便随后的load动作使用
- load(载入) : 作用于工作内存的变量, 它把read操作从主内存中得到的变量的值放入工作内存的变量副本中
- use(使用) : 作用于工作内存的变量, 它把工作内存中一个变量的值传递给执行引擎, 每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作
- assign(赋值) : 作用于工作内存的变量, 它把一个从执行引擎接收到的值赋给工作内存的变量, 每当虚拟机遇到一个给变量赋值的字节码指令时, 执行这个操作
- store(存储) : 作用于工作内存的变量, 它把工作内存中的一个变量的值传送到主内存中, 以便随后的write内存操作使用
- write(写入) : 作用于主内存的变量, 它把store操作从工作内存中得到的变量的值放入主内存的变量中
也有内存屏障:
- LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕
- StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见
- LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕
- StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能
volatile屏障:
- 在每个volatile写操作前插入StoreStore屏障,在写操作后插入StoreLoad屏障;
- 在每个volatile读操作前插入LoadLoad屏障,在读操作后插入LoadStore屏障;
内存屏障主要是为了防止指令重排序,而volatile的可见性主要是由Lock指令实现的,实现技术为:缓存一致性协议!这也是什么volatile被称之为轻量级锁,因为它确实使用了锁,但锁的是缓存一致性协议里面的缓存行。