1.volatile變數自身具有下列特性:
·可見性:對乙個volatile變數的讀,總是能看到(任意執行緒)對這個volatile變數最後的寫入。
·原子性:對任意單個volatile變數的讀/寫具有原子性,但類似於volatile++這種復合操作不具有原子性。
從記憶體語義的角度來說,volatile的寫-讀與鎖的釋放-獲取有相同的記憶體效果:
volatile寫和鎖的釋放有相同的記憶體語義;
volatile讀與鎖的獲取有相同的記憶體語義。
3.volatile寫-讀的記憶體語義 :
寫:當寫乙個volatile變數時,jmm會把該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。
讀:當讀乙個volatile變數時,jmm會把該執行緒對應
的本地記憶體置
為無效。執行緒接下來將從主記憶體中
讀取共享變數。
4.語義總結:
·執行緒a寫乙個volatile變數,實質上是執行緒a向接下來將要讀這個volatile變數的某個執行緒發出了(其對共享變數所做修改的)訊息。
·執行緒b讀乙個volatile變數,實質上是執行緒b接收了之前某個執行緒發出的(在寫這個volatile變數之前對共享變數所做修改的)訊息。
·執行緒a寫乙個volatile變數,隨後執行緒b讀這個volatile變數,這個過程實質上是執行緒a通過主記憶體向執行緒b傳送訊息。
5.jmm記憶體屏障插入策略:
·在每個volatile寫操作的前面插入乙個storestore屏障(禁止上面的普通寫和下面的volatile寫重排序)。
個人見解:每次volatile寫操作後都要將本地記憶體重新整理到主記憶體,所以這裡如果不加屏障禁止重排序就可能導致共享變數無法及時對所有執行緒可見。
·在每個volatile寫操作的後面插入乙個storeload屏障(禁止上面的volatile寫與下面可能有的volatile讀/寫重排序)。
·在每個volatile讀操作的後面插入乙個loadload屏障(禁止下面所有的普通讀寫操作和上面的volatile讀重排序)和乙個loadstore屏障(禁止下面所有的普通寫操作和上面的volatile讀重排序)
。個人見解:每次volatile讀之前都要將本地記憶體捨棄去主記憶體獲取最新資料,加屏障禁止重排序的作用是為了保證下面的普通讀寫的資料不會被捨棄。
volatile記憶體語義
1 可見性 不管是volatile讀還是volatile寫,都會重新訪問主記憶體取最新的值 2 有序性 防止重排序 volatile寫前 storestore屏障 首先先把前面的普通寫操作執行到主記憶體,在執行volatile寫操作執行到記憶體 保證前面普通寫操作和volatile寫操作不重排,前面...
volatile的記憶體語義
volatile的應用與底層原理詳見 volatile的應用與底層原理 class volatilefeature ample public void getandincrement public long get 假設有多個執行緒分別呼叫上面程式的3個方法,這個程式在語義上和下面程式等價。clas...
volatile的記憶體語義
一 保證記憶體的可見性 二 對任意單個volatile變數的讀 寫具有原子性,但類似於volatile 這種復合操作不具有原子性 三 禁止指令的重排序 解析 一 對於使用volatile關鍵字的共享變數,會強制將修改後的值立即寫入主記憶體,並會使得其他處理器裡面的快取行失效 嗅探機制,快取一致性協議...