volatile的應用場景

2021-09-29 21:23:37 字數 777 閱讀 7326

下面先來想一下單例模式中的雙端檢查

public class singleton 

private static singleton getinstance()

return instance;

}}

思考這樣乙個場景:

有兩個執行緒,執行緒a和執行緒b, 執行緒a是初次訪問getinstance()方法, 此時在第乙個if處instance == null為true, 進入同步**塊, 此時執行緒b也來訪問getinstance()方法, 執行緒b在第乙個if處instance == null可能返回false, 但是此時的instance並沒有完全例項化完, 這樣執行緒b返回了乙個沒有被完全例項化完的instance, 那麼執行緒b在拿這個instance就存在問題

問題出現在**?

instance = new singleton();不是個原子操作,多執行緒環境下會出現指令重排,instance = new singleton();這個操作可以拆分成3個操作

a.分配記憶體空間

b.例項化物件instance

c.把instance引用指向已分配的記憶體空間,此時instance有了記憶體位址,不再為null了

由於指令重排可能使得a-c,然後執行緒a就被執行緒b阻塞,由於記憶體位址不為空,執行緒b會直接返回沒有例項化的instance,那麼後續必然會出錯

怎樣解決?

private static volatile singleton instance = null;

Volatile的應用場景

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

volatile的用法和實際應用場景

1 volatile提醒編譯器它後面所定義的變數隨時有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都要小心地。從該變數的位址中讀取。如果沒有volatile關鍵字,則編譯器就可能優化讀取和儲存,可能暫時使用暫存器中的值。當要求使用volatile宣告變數的時候,系統總是重新從它所在的...

volatile的使用場景

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