章節目錄
3.volatile 寫-讀的記憶體語義
1.volatile 的特性
首先應該明確的一點是:當宣告共享變數為volatile後,對這個變數的讀/寫(分為單元素讀寫,與復合寫操作)。不同的讀寫模式下,volatile變數對寫操作的原子性體現是不一樣的。
理解volatile特性的乙個好辦法是把對volatile變數的單個讀/寫,看成是同乙個鎖對這些單個讀/寫操作做了同步,示例**如下所示:
class volatilefeature***ample
public void getandincrement()
public long get()
}
假設有多個執行緒呼叫上述程式中的3個方法,這個程式語義和下面的程式語義等價
class volatilefeature***ample
public void getandincrement()
public syntronized long get()
}
解釋volatile 自身特性:
1.記憶體可見性:對乙個volatile變數的讀,總能看到任意執行緒對這個volatile變數
最後的寫入(記憶體可見性保證)
2.原子性:對任意單個volatile變數的單獨的讀寫操作,都具有原子性。但對於
volatile++這種復合操作不具有原子性。
jmm基於共享記憶體模型實現執行緒之間的通訊
從jdk1.5 開始 volatile 變數的寫-讀可以實現執行緒之間的通訊。
volatile & synchronized記憶體語義
從記憶體語義來說,volatile的寫-讀與鎖的釋放-獲取有相同的記憶體效果:volatile
寫和鎖釋放有相同的記憶體語義;volatile讀與鎖的獲取有相同的記憶體語義。
下面為volatile變數示例**:
class volatileexample
public void reader()}}
圖形化形勢如下圖所示:
a執行緒在寫乙個volatile變數後,b執行緒讀同乙個volatile變數。a執行緒在寫volatile之前所有的可見共享變數,在b執行緒讀到同乙個volatile變數之後,將立即變得對b執行緒可見。
4. volatile 寫-讀的記憶體語義
** volatile 寫記憶體語義 **
當寫乙個volatile變數時,jmm會把該執行緒對應的本地記憶體的變數中的變數值強制重新整理到主記憶體。
volatile 讀的記憶體語義
當讀乙個volatile變數時,jmm會把該執行緒對應的本地記憶體置為無效。執行緒接下來將從主記憶體中讀取共享變數。
volatile記憶體語義 總結 java記憶體模型
一 原子性 原子性是指乙個操作是不可中斷的,即使是多個執行緒一起執行的時候,乙個操作的開始,就不會被其他執行緒干擾 那麼有人會想到 i 是原子操作嗎?答案肯定不是。因為i 至少包含兩個操作,讀 從記憶體中讀出來 和行為 加上去 還有可能把加完後的資料在方法到i裡面去,出來也是1,這兩個執行緒同時進行...
Java記憶體模型
1.首先,執行緒a把本地記憶體a中更新過的共享變數重新整理到主記憶體中去。2.然後,執行緒b到主記憶體中去讀取執行緒a之前已更新過的共享變數。1.共享物件對各個執行緒的可見性 2.共享物件的競爭現象 指令級並行的重排序 如果不存l在資料依賴性,處理器可以改變語句對應機器指令的執行順序。記憶體系統的重...
Java記憶體模型
int x 0 thread a int y x thread bint x 5 int y 8 int z x y 關於上面的 存在這樣關係 x和z之間存在資料依賴關係,同時y和z之間也存在資料依賴關係。為了得到正確的結果,執行指令序列時,z不能重排序到x和y的前面。但是x和y之間並沒有資料依賴關...