volatile的使用場景

2022-07-26 11:54:09 字數 976 閱讀 6521

單詞解釋:

亂序執行:指cpu對**的執行順序進行亂序優化,但保證各執行**單元的順序按指令順序排列。以達到充分利用處理器的各處理單元的目的。(可以理解成:乙個任務有不同的執行單元,這些單元之間有一定的執行順序,但部分執行單元可提前工作亂序執行就是讓這部分執行單元提前一段時間執行,從而提高整體的效率,減少整體執行時間)。

保證執行緒安全的核心要素:原子性和可見性(執行緒的同步機制都是圍繞這兩點來保證執行緒的安全性);

race condition(競爭條件):當兩個以上執行緒讀寫某些共享資料,而最後的結果取決於程序進行的精確時序,稱為競爭條件(race condition);

可見性問題出現原因:

為了協調cpu和記憶體讀寫速度巨大差異的問題,所以有了快取記憶體的出現(cpu不會每次獲取資料都從記憶體獲取,而是在快取記憶體中儲存有拷貝),但同時產生了可見性問題(由於cpu對記憶體中的物件的讀取並不是原子操作,所以執行緒a拿到的物件並不一定是執行緒b寫入的物件,此處有亂序執行的影響,但不止此因素)。

volatile只能保證操作的可見性,但無法保證操作的原子性,所以使用條件會比synchronized苛刻,如下(必須同時滿足):

1.更改不依賴於當前值,或能夠確保只會在單一執行緒中修改變數的值,如果對變數的修改依賴於現有值,就是乙個race condition操作,此時就需要使用其它方式了(比如synchronized),volatile對原子性的問題發能為力。

public

class socketthread extends

thread

}}

其實,我覺著把「作業系統」系統學習一遍更好,不過,短期內暫時沒有這本書的學習計畫,往後排吧。

volatile的應用場景

下面先來想一下單例模式中的雙端檢查 public class singleton private static singleton getinstance return instance 思考這樣乙個場景 有兩個執行緒,執行緒a和執行緒b,執行緒a是初次訪問getinstance 方法,此時在第乙個...

Volatile的應用場景

1 當乙個變數可能會被意想不到的更新時,要使用volatile來宣告該變數,告訴編譯器它所修飾的變數的值可能會在任何時刻被意外的更新。2 語法 volatile int foo int volatile foo volatile int foo int volatile foo int volati...

volatile關鍵字的使用場景

使用場景 volatile如果想控制線程併發的話,需要判斷 volatile 保證了程式的可見性,但是用之前需要判斷下,如下 跑一下就清晰了,算是乙個低能耗的併發鎖,volatile能保證 資料被多個執行緒訪問的可見性,但是保證不了原子性,有點類似樂觀鎖 改後立刻同步到主記憶體.public cla...