《内存屏障(Memory Barrier)(一)什么是写屏障?》
《内存屏障(Memory Barrier)(二)什么是读屏障?》
《内存屏障(Memory Barrier)(三)volatile关键字是怎么实现的?》
其实每个系统的内存屏障可能都不一定相同。
一、Java平台的兼容
为了兼容不同平台的内存屏障的实现,JVM基于自己的模型做了内存屏障:
- 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屏障;
JVM这么插入是基于volatile关键字的特性:
- 保证volatile全局可见
- 保障volatile的操作不会被重排序。