23種設計模式 單例模式

2021-10-01 06:16:25 字數 2125 閱讀 9385

單例模式:

保證乙個類只有乙個例項,並且提供乙個該例項的全域性訪問點

單例模式的要素

public

class

singleton1

//2、類初始化的時候,立即載入該物件

private

static singleton1 singleton1 =

newsingleton1()

;//3、提供獲取該物件的公共方法

public staticsingleton1 getinstance()

}

優點:執行緒安全、呼叫效率高

缺點:在多例項或者有其他靜態方法時,在啟動時沒有使用它的時候就已經載入好了,浪費記憶體。

public

class

singleton2

//2、類初始化的時候,不立即載入該物件

private

static singleton2 singleton2;

//3、提供獲取該物件的方法,有synchronized,效率較低

public

static

synchronized singleton2 getinstance()

}

優點:執行緒安全,在沒有使用時不用載入,節省記憶體。

缺點:呼叫效率不高

double check lock 雙重檢查加鎖

public

class

singleton3

//2、類初始化的時候,不立即載入該物件

private

static

volatile singleton3 singleton3;

//3、提供獲取該物件的方法,有synchronized,效率較低

public

static singleton3 getinstance()

}}return singleton3;

}}

優點:在沒有使用時不用載入,節省記憶體,而且改善了 餓漢式效率低的問題

缺點:在一種極端情況下,當第乙個執行緒進入第二次if判斷,開始建立物件,這時第二個執行緒進來開始進行第乙個if判斷,這樣判斷出物件已經非空了,於是直接return返回物件,但是第乙個執行緒還沒有執行結束,可能會發生意想不到的情況。所以可以給物件加volatile優化一下(使用volatile關鍵字修飾的變數會強制將修改的值立即寫入主存),但不能完全避免問題。

public

class

singleton4

private

static

class

innerclass

public

static singleton4 getinstance()

}

優點:執行緒安全、呼叫效率高,優化了飢漢式浪費記憶體的問題

缺點:反射可以通過關閉許可權檢測,然後建立出的物件會破壞單例

可以看出,單例被破壞了

但是可以通過給構造方法裡加執行緒鎖判斷來防止通過反射破壞單例,如果發現有人有破壞單例的行為,給他丟擲乙個執行時異常

}優點:列舉底層**不允許使用反射建立物件,所以用列舉建立單例是安全的

缺點:不能延時載入

23種設計模式 單例模式

某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...

單例模式(23種設計模式)

單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...

23種設計模式 單例模式

單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...