java併發程式設計——volatile關鍵字

ahiru?發表於2019-02-01

用volatile修飾的變數,執行緒在每次使用變數的時候,都會讀取變數修改後的最新的值。

要了解volatile關鍵字的作用,首先要先了解JVM在執行時候的記憶體分配過程。

java併發程式設計——volatile關鍵字


當執行緒訪問某一個變數的值的時候,首先會在主記憶體找到對應的變數的值,然後把具體值load到執行緒自己的工作記憶體(每個執行緒都要自己的工作記憶體,且每個執行緒不能訪問其他執行緒的工作記憶體),然後建立一個變數副本,直接修改副本變數的值,最後同步到主記憶體。

可見性

一旦一個共享變數被volatile修飾之後,保證了不同執行緒對這個變數進行操作時的可見性。即一個執行緒修改了某個變數的值,新值對其他執行緒來說是立即可見的。

有序性

1.當程式執行到volatile變數的讀操作或者寫操作時,在其前面的操作的更改肯定全部已經進行,且結果已經對後面的操作可見;在其後面的操作肯定還沒有進行;

2.在進行指令優化時,不能將在對volatile變數訪問的語句放在其後面執行,也不能把volatile變數後面的語句放到其前面執行。

例子:

//x和y為非volatile變數
//flag為volatile變數

x = 2;            //語句1
y = 0;            //語句2
flag = true;      //語句3
x = 4;            //語句4
y = -1;           //語句5複製程式碼

volatile關鍵字能保證,執行到語句3時,語句1和2必定是執行完畢的,然後執行語句3,語句3執行完畢後,執行語句4和5。但是語句1和2的順序、語句4和5的順序是不作任何保證的。


參考資料:Java併發程式設計:volatile關鍵字解析


相關文章