java併發編程——volatile關鍵字

用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

相關文章
相關標籤/搜索