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