首頁  >  文章  >  Java  >  Java使用volatile關鍵字的注意事項

Java使用volatile關鍵字的注意事項

高洛峰
高洛峰原創
2017-02-27 15:20:171736瀏覽

 Volatile 變數具有 synchronized 的可見性特性,但是不具備原子特性。這就是說線程能夠自動發現 volatile 變數的最新值。 Volatile 變數可用於提供執行緒安全,但只能套用於非常有限的一組用例:多個變數之間或某個變數的目前值與修改後值之間沒有約束。因此,單獨使用 volatile 還不足以實現計數器、互斥鎖或任何具有與多個變數相關的不變式。

volatile關鍵字是Java中的一種稍弱的同步機制,為什麼稱為弱機制。

 在理解這個之前,我們先來看看java在進行同步時必須遵守的兩個機制:

 1、可見性:當一個執行緒修改一個共享變數時,另外一個線程能讀到這個修改的值。

 2、原子性:指不可分割,此處指程式執行過程中,某操作不能中斷,則為原子操作。

 volatile關鍵字無法保證原子性,只能保證可見性,故在一般情況下不能使用該關鍵字進行同步操作。但是當滿足以下兩個特定條件時,可以使用其進行同步:

 1、運算結果並不依賴變數的目前值,或能夠保證只有單一的執行緒修改變數的值。

 2、變數不需要與其他的狀態變數共同參與不變約束

範例:

volatile boolrean flag;
public void close(){
    flag = true;
}
public void open(){
   while(!flag){
    ...
   }
}

 此時open()方法的執行依賴flag的值,必須使用同步,但是使用synchronized關鍵字或其他方法同步比較繁瑣,此時該情景符合以上兩個條件,故可以使用volatile關鍵字進行同步。

volatile關鍵字原理:

  被volatile修飾的變量,不會緩存在寄存器或其他地方,每次寫直接寫去主內存,讀也是從主記憶體讀取。所以可以保證可見性。

以上所述是小編給大家介紹的Java使用volatile關鍵字的注意事項,希望對大家有幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對PHP中文網的支持!


更多Java使用volatile關鍵字的注意事項相關文章請關注PHP中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn