用volatile修飾的變數,執行緒在每次使用變數的時候,都會讀取變數修改後的最新的值。
要了解volatile關鍵字的作用,首先要先了解JVM在執行時候的記憶體分配過程。
當執行緒訪問某一個變數的值的時候,首先會在主記憶體找到對應的變數的值,然後把具體值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的順序是不作任何保證的。