java中的volatile,从网上很多资料来看,保证了被修饰变量的可见性以及有序性
对于这个有序性,是通过编译时候生成对应的内存屏障来保证不会被重排序。而这个内存屏障对应的指令码有以下4中:
storestore, storeload, loadload, loadstore
这种xy形式的指令,其语义如下:在xy之前的x操作,不能与xy之后的y操作进行重排序。
对于读的情况,加入的指令如下
loadload
load 读操作
loadstore
对于写,如下所示
storestore
store 写操作
storeload
根据以上的两种类型,来仔细查看两种操作的4个组合:读读,读写,写读,写写
读读,如下。这种情况load1和load2是否会被重排序呢?不会,第4行保证了前后的load操作不能重排序
loadload
load1
loadstore
loadload
load2
loadstore
读写,如下。也不会被重排序,第3行的loadstore保证了。
loadload
load1
loadstore
storestore
store1
storeload
写读,如下。不会被重排序,第3行的storeload保证了。
storestore
store1
storeload
loadload
load1
loadstore
写写,如下。不会被重排序,第4行的storestore保证了。
storestore
store1
storeload
storestore
store2
storeload
参考链接:
https://www.jianshu.com/p/2ab5e3d7e510
https://www.jianshu.com/p/a67dc1c11088
https://www.jianshu.com/p/43af2cc32f90
原文:https://www.cnblogs.com/zhangxuezhi/p/11878207.html