單例模式與double check

2021-07-24 19:45:04 字數 1023 閱讀 2968

本文主要是講double check,通常double check比較少用,一般是在高併發的情況下。但是建議大家寫單例的時候都用上。

單例模式分兩種:餓漢式與懶漢式,餓漢式是指在類載入時就進行例項化,而懶漢式是指在使用時才進行例項化。**如下:

餓漢式:

public class singleton

public static singleton getinstance()

懶漢式:

public class singleton

public static singleton getinstance()

return s;}

double check在餓漢式中是肯定不會存在的,所以我們討論的就是懶漢式的情況。看一種情況:如果同時兩個執行緒同時訪問getinstance()方法,執行緒a已經過了if判斷,正在初始化物件,但是可能由於構造時間比較長,還沒有構造完。這個時候s還沒有指向的物件,而同時執行緒b在進行判斷if的時候肯定也是null,自然也就可以通過,這時也可以進行new初始化,這樣的話就會生成兩個物件。因為是兩個物件,兩個執行緒中的資料肯定是不對的,所以會導致一系列的資料不一致的問題。這時我們可以考慮在方法上加synchronized關鍵字,或者在if外面加一層synchronized**塊,如下:

synchronized(singleton.class)

}這個時候我們發現併發問題是解決了,但是這時又會產生另外乙個問題,如果s已經例項化了,就是說s != null了,而之後訪問的物件依然要獲取鎖,這樣的話,在高併發的環境下,效能就會非常差,因為每個請求都要上鎖,必須挨個獲取鎖才行。此時我們可以在synchronized外面再加一層if(s == null)來判斷,就可以解決這個問題了,如果初始化完成之後,再進行判斷,則直接跳過,返回s的物件,完整的**如下:

public static singleton getinstance() }}

return s;

double check就是指做了兩次if判斷,第一次的主要是作用是為了解決效能問題,第二次才是為了解決併發的問題,防止生成兩個物件。

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例模式與多例模式

共同點 建構函式私有化 有什麼用?單例設計模式的特點 多例設計模式 多例設計模式和單例一樣都需要建構函式私有化,多例是根據不同的需求返回多個單例中的指定值。a code block public class message 餓漢式 class singletonhungry 構造方法私有化 publ...

設計模式與單例模式

1.是在大量的事件中總結和理論化之後優選的 結構,程式設計風格 以及解決問題的思考方式。2.經典的設計模式有23種 1.採取一定的方法保證在整個軟體系統中,對某個類只能存在乙個物件例項 2.餓漢式 class bank 2.內部建立當前類的例項 private static bank bank ne...