用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改後的最新的值。html
要了解volatile關鍵字的做用,首先要先了解JVM在運行時候的內存分配過程。編程
當線程訪問某一個變量的值的時候,首先會在主內存找到對應的變量的值,而後把具體值load到線程本身的工做內存(每一個線程都要本身的工做內存,且每一個線程不能訪問其餘線程的工做內存),而後創建一個變量副本,直接修改副本變量的值,最後同步到主內存。bash
一旦一個共享變量被volatile修飾以後,保證了不一樣線程對這個變量進行操做時的可見性。即一個線程修改了某個變量的值,新值對其餘線程來講是當即可見的。併發
1.當程序執行到volatile變量的讀操做或者寫操做時,在其前面的操做的更改確定所有已經進行,且結果已經對後面的操做可見;在其後面的操做確定尚未進行;優化
2.在進行指令優化時,不能將在對volatile變量訪問的語句放在其後面執行,也不能把volatile變量後面的語句放到其前面執行。spa
例子:線程
//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的順序是不做任何保證的。code
參考資料:Java併發編程:volatile關鍵字解析cdn