劍指offer 題2 單例模式

2021-07-31 08:22:18 字數 1179 閱讀 6992

懶漢式–第一次呼叫時載入

1. 第一版 上來沒有想很多,直接敲起,使用synchronized保證執行緒安全,**如下:

public class  single;

//使用synchronized保證安全

public static synchronized single getsingle()

return instance;

}}

2.第一版的缺點:當兩個執行緒 同時訪問執行緒鎖的時候,出現競爭,乙個獲得鎖,乙個等待,等第乙個執行緒執行完之後,第二個執行緒才能獲得鎖,執行判斷條件.這樣效率會很低.

看了一篇部落格後發現,可以使用雙重判斷進行優化,改進版如下:

public  class single2 ;

private single2 getsingle() }}

return instance;

}}

3.部落格中提到的完美版本:volatile關鍵字版

解決上面版本中可能出現的指令重排導致不穩定結果的出現:

1.給instance分配記憶體

2.呼叫建構函式初始化成員變數,建立例項

3.將instance指向分配的記憶體空間//注意是指向記憶體空間,不是例項

在jvm中可能會出現指令重排問題而導致步驟2和3的順序不能保證,當執行緒1如果在執行完指令1後直接執行指向3,如果在其執行完3而未執行2時,執行緒2開始訪問第一層if判斷,注意這時的instance就已經不是null了,它已經指向了jvm分配的記憶體空間,這樣執行緒2就會直接返回中間態instance,繼續執行下去將會報錯.

解決方法使用volatile關鍵字修飾instance,volatile會產生記憶體屏障,從而禁止指令重排

public class single3 ;

private single3 getsingle() }}

return instance;

}}

2.餓漢式 –在類裝載時建立例項

這種情況下例項在類載入器載入類初始化,這時jvm會保證執行緒同步

public class single4;

public static single4 gesingle()

}

劍指offer 2 單例模式

實現乙個單例模式 實現單例模式的關鍵在於 將建構函式設定為private,或是protected 建立乙個靜態函式,呼叫建構函式。使用乙個靜態成員變數儲存單例物件 因為只能在堆上分配記憶體,因此需要乙個函式顯式的呼叫析構函式 class singleton return obj singleton ...

劍指offer 單例模式

單例模式分為懶漢式和餓漢式。所謂單例模式,就是構造器私有化,對外界提供唯一的乙份例項。public class test class person 構造器私有化 public static person getinstance return p public class test class per...

《劍指offer》系列 單例模式

永遠年輕,永遠熱淚盈眶。寫乙個單例模式 單例模式有多種寫法,以下整理了六種寫法,你都學會了嗎?public class test01 public singleton1 getinstance 懶漢式 非執行緒安全的 public static class singleton2 public sin...