使用volatile關鍵字的場景

2022-09-13 05:27:10 字數 1425 閱讀 9674

synchronized關鍵字是防止多個執行緒同時執行一段**,那麼就會很影響程式執行效率,而volatile關鍵字在某些情況下效能要優於synchronized,但是要注意volatile關鍵字是無法替代synchronized關鍵字的,因為volatile關鍵字無法保證操作的原子性。通常來說,使用volatile必須具備以下2個條件:

1)對變數的寫操作不依賴於當前值

2)該變數沒有包含在具有其他變數的不變式中

實際上,這些條件表明,可以被寫入 volatile 變數的這些有效值獨立於任何程式的狀態,包括變數的當前狀態。

事實上,我的理解就是上面的2個條件需要保證操作是原子性操作,才能保證使用volatile關鍵字的程式在併發時能夠正確執行。

下面列舉幾個j**a中使用volatile的幾個場景。

1.狀態標記量12

3456

789volatilebooleanflag =false;

while(!flag)

publicvoidsetflag()12

3456

78910

volatilebooleaninited =false;

//執行緒1:

context = loadcontext();

inited =true;

//執行緒2:

while(!inited )

dosomethingwithconfig(context);

2.double check12

3456

78910

1112

1314

1516

17classsingleton

publicstaticsingleton getinstance()

}

returninstance;

}

volatile關鍵字的使用

volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。下面舉例說明。經常...

volatile關鍵字的使用

msdn手冊中對volatile關鍵字的解釋 大概的翻譯 volatile關鍵字是乙個型別限定符,用於宣告乙個物件可以通過其他語句 例如作業系統 硬體或併發執行的執行緒 在程式中進行修改。volatile關鍵字的兩個功能 1 防止編譯器對彙編指令做順序上的優化。2 防止暫存器儲存變數的副本值。應用在...

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...