關於DCL單例模式加volatile的問題

2021-10-05 05:46:34 字數 955 閱讀 2289

volatile禁止指令重排

public class singleton 

public static singleton getinstance() }}

return instance;}}

當乙個執行緒進入開始在記憶體new物件空間的時候,因為cpu底層會進行指令重排,如果此時位元組碼發生先new 再 astore在invokespecial的時候,此時在invokespecial呼叫之前執行緒物件半初始化,產生與堆空間物件的鏈結,此時其他的執行緒進入判斷instance 不為空然後進行其他操作此時就會出現問題,而volatile可以禁止指令重排,這樣就可以避免出現問題

作業系統的底層屏障lfence mfence sfence

volatile如何解決指令重排

1volatile 原始碼層級

2acc_volatile 位元組碼層級

3jvm的記憶體屏障 jvm層級

屏障兩邊的指令不能重排**

4hotspot實現 hotspot層級

5正真意義上的電訊號層級

設計模式之單例DCL為什麼需要volatile

單例模式dcl實現 pulic class singleton 類的內部宣告變數 volatile防止指令重排 private static volatile singleton singleton 對外暴露乙個靜態方法,當呼叫該方法時,才去建立例項 singleton 加入雙重檢查,解決執行緒安全...

dcl單例模式

有時候我們需要對外呈現只有乙個物件,簡單來說就是講物件私有化,像資料那樣,只能通過get方法得到。這裡使用doublechecking來進行該操作,即在get方法裡面加入兩個判斷該物件是否為空,同時為了避免指令重排導致執行緒獲得空物件,加入volatile,而且私有化構造器。public class...

DCL單例模式

單例模式 外部不能new物件,類的內部有且只有乙個物件,僅僅用乙個靜態方法與外界進行互動。public class doublecheckedlocking 外部只能通過這個get方法和此物件進行交流 public static doublecheckedlocking getinstance 繫結...