java volatile的 store load相关指令
java中的volatile,从网上很多资料来看,保证了被修饰变量的可见性以及有序性
对于这个有序性,是通过编译时候生成对应的内存屏障来保证不会被重排序。而这个内存屏障对应的指令码有以下4中:
storestore, storeload, loadload, loadstore
这种xy形式的指令,其语义如下:在xy之前的x操作,不能与xy之后的y操作进行重排序。
但是具体是怎么保障其读写的有序性的,好像没有一个固定的加屏障的模式,看了网上的答案,也没有给出准确的描述。
估计是根据实际的指令来加上对应的内存屏障。
附注:
对于store操作,其屏障如何加,是否该操作的前后的所有store和load都不能进行重排序,还是部分不能重排序?
同理,对于load操作,是否加的屏障是这样的:保证该操作不能与前后的所有store和load进行重排序呢?
没搞明白。使用上是没问题,但是原理还是有点模糊。
但至少可以确定的是,对于同样用volatile修饰的两个变量,无论是load还是store都不能进行重排序。
参考链接:
https://www.jianshu.com/p/2ab5e3d7e510
https://www.jianshu.com/p/a67dc1c11088
https://www.jianshu.com/p/43af2cc32f90
https://blog.csdn.net/hqq2023623/article/details/51013468
http://gee.cs.oswego.edu/dl/jmm/cookbook.html