【轉】Volatile 實現理

【轉】Volatile 實現理
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

volatile

java程式語言允許執行緒訪問共享變數,為了確保共享變數能被準確和一致的更新,執行緒應該確保通過排他鎖單獨獲得這個變數。Java語言提供了volatile,在某些情況下比鎖更加方便。如果一個欄位被宣告成volatile,java執行緒記憶體模型確保所有執行緒看到這個變數的值是一致的。

這個變數用夠很久,一直都沒有深入研究過,雖然說知道主要是用於執行緒內變數共享,但卻不知所以然,正好看到一個博文,感覺寫的很nice,就摘抄了其中一些,補了一個個人理解的圖

原文連結: 聊聊併發(一)深入分析Volatile的實現原理

實現原理

處理器為了提高處理速度,不直接和記憶體進行通訊,而是先將系統記憶體的資料讀到內部快取(L1,L2或其他)後再進行操作,但操作完之後不知道何時會寫到記憶體,如果對宣告瞭Volatile變數進行寫操作,JVM就會向處理器傳送一條Lock字首的指令,將這個變數所在快取行的資料寫回到系統記憶體。但是就算寫回到記憶體,如果其他處理器快取的值還是舊的,再執行計算操作就會有問題,所以在多處理器下,為了保證各個處理器的快取是一致的,就會實現快取一致性協議,每個處理器通過嗅探在匯流排上傳播的資料來檢查自己快取的值是不是過期了,當處理器發現自己快取行對應的記憶體地址被修改,就會將當前處理器的快取行設定成無效狀態,當處理器要對這個資料進行修改操作的時候,會強制重新從系統記憶體裡把資料讀到處理器快取裡
用一個圖簡單的說明上面的過程

圖畫的一般般,簡單說一下

cpu與內部快取進行互動
volatile生命的變數,操作完之後寫入記憶體(data -> data’ 同時寫入記憶體)
其他cpu快取嗅探匯流排變動,並設定自己的data無效,使用時,從記憶體中獲取

輸入圖片說明


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}

程式語言 最新文章