volatile的寫鎖對應的是鎖的鎖定
volatile的讀鎖對應的是鎖的釋放
q:為什麼volatile的讀寫與普通的讀寫要通過記憶體屏障來保障不能重排序捏?
1:v寫之前的操作不能與v寫進行重排序
2:v讀之後的操作不能與v讀進行重排序
3:v寫不能與v讀進行重排序
volatile的讀寫鎖在記憶體語義上看就是執行緒與執行緒之間的通訊。
針對v寫的記憶體語意,v寫會將快取中的資料全部刷到主記憶體當中去
根據v寫的記憶體語意,我們可以了解到,如果前面變數的操作重排序到v寫的後面,那麼就極有可能造成主記憶體中的資料與快取中的資料無法同步,那麼此時有操作在去讀取資料時,從主記憶體中拉取的資料可能就不是最新的資料。
乙個變數被volatile修飾後,jvm會為我們做兩件事:
1.在每個volatile寫操作前插入storestore屏障,在寫操作後插入storeload屏障。
2.在每個volatile讀操作前插入loadload屏障,在讀操作後插入loadstore屏障。
volatile優點是:不需要加鎖也能保持執行緒的可見性,減少上下文之間的切換次數。
volatile記憶體語義
1 可見性 不管是volatile讀還是volatile寫,都會重新訪問主記憶體取最新的值 2 有序性 防止重排序 volatile寫前 storestore屏障 首先先把前面的普通寫操作執行到主記憶體,在執行volatile寫操作執行到記憶體 保證前面普通寫操作和volatile寫操作不重排,前面...
volatile 與記憶體屏障
volatile c語言中 volatile 關鍵字用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。volatile只能保證編譯器不會做亂序執行優化.1.不對 p操作生成亂序指令 通常如此,具體請看後面的解釋 比如條件判斷 2.每次從 p取資料的時候,一定會進行一次訪存操作,哪怕前面不久...
volatile 記憶體可見性
public class volatilethread implements runnable catch interruptedexception e flag true system.out.println flag isflag public boolean isflag public cla...