synchronized關鍵字是防止多個執行緒同時執行一段**,那麼就會很影響程式執行效率,而volatile關鍵字在某些情況下效能要優於synchronized,但是要注意volatile關鍵字是無法替代synchronized關鍵字的,因為volatile關鍵字無法保證操作的原子性。通常來說,使用volatile必須具備以下2個條件:
1)對變數的寫操作不依賴於當前值
2)該變數沒有包含在具有其他變數的不變式中
實際上,這些條件表明,可以被寫入 volatile 變數的這些有效值獨立於任何程式的狀態,包括變數的當前狀態。
事實上,我的理解就是上面的2個條件需要保證操作是原子性操作,才能保證使用volatile關鍵字的程式在併發時能夠正確執行。
下面列舉幾個j**a中使用volatile的幾個場景。
1.狀態標記量12
3456
789volatile
boolean
flag =
false
;
while
(!flag)
public
void
setflag()
12
3456
78910
volatile
boolean
inited =
false
;
//執行緒1:
context = loadcontext();
inited =
true
;
//執行緒2:
while
(!inited )
dosomethingwithconfig(context);
2.double check12
3456
78910
1112
1314
1516
17class
singleton
public
static
singleton getinstance()
}
return
instance;
}
volatile關鍵字的使用
volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。下面舉例說明。經常...
volatile關鍵字的使用
msdn手冊中對volatile關鍵字的解釋 大概的翻譯 volatile關鍵字是乙個型別限定符,用於宣告乙個物件可以通過其他語句 例如作業系統 硬體或併發執行的執行緒 在程式中進行修改。volatile關鍵字的兩個功能 1 防止編譯器對彙編指令做順序上的優化。2 防止暫存器儲存變數的副本值。應用在...
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...