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

原文地址:https://www.cnblogs.com/zhangxuezhi/p/11878207.html