下面先來想一下單例模式中的雙端檢查
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對 的執行順序進行亂序優化,但保證各執行 單元的順序按指令順序排列。以達到充分利用處理器的各處理單元的目的。可以理解成 乙個任務有不同的執行單元,這些單元之間有一定的執行順序,但部分執行單元可提前工作,亂序執行就是讓這部分執行單元提前一段時間執行,從而提高整體的效率,減少...