来源:https://www.bilibili.com/video/BV1Rv411y7MU?from=search&seid=9769842728262062596
硬件层的内存屏障分为两种:Load Barrier(读屏障) 和 Store Barrier(写屏障)。内存屏障主要有以下两个作用:
1.阻止屏障两侧的指令重排序;
关于指令重排序的概念参照博客:https:///qq_41899026/article/details/118641516
2.强制把写缓冲区/高速缓存中的脏数据(在当前工作内存中修改过的数据)等store到主内存,同时让缓存中相应的数据失效。
在JSR(JavaSpecification Requests, Java 规范提案)中定义了4种内存屏障:
LoadLoad屏障(读读屏障):(指令Load1; LoadLoad; Load2),在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
LoadStore屏障(读写屏障):(指令Load1; LoadStore; Store2),在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
StoreStore屏障(写写屏障):(指令Store1; StoreStore; Store2),在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
StoreLoad屏障(写读屏障):(指令Store1; StoreLoad; Load2),在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能
对于volatile关键字,按照规范会有下面的操作:
通过上面两个操作说明,volatile关键字可以禁止指令重排
因篇幅问题不能全部显示,请点此查看更多更全内容