設計模式筆記 單例 Singleton

2021-10-01 05:14:34 字數 3220 閱讀 8935

多種實現單例的方式,但都具備以下概念。

餓漢模式

餓漢模式-靜態塊

懶漢模式-非執行緒安全

懶漢模式-執行緒安全

雙檢查鎖模式-dcl

package design.structural.singleton;

/** * 餓漢模式

* 優點:

* 實現簡單

* 缺點:

* 不能延時載入,即使單例不會被用到頁會被初始化

* 不能進行異常處理

* * @author faith.huan 2019-12-02 22:11

*/public

class

eagersingleton

/** * 通過公有靜態方法,提供全域性訪問入口

*/public

static eagersingleton getinstance()

}

針對餓漢模式無法處理異常缺陷的優化版本,採用靜態塊初始化例項

package design.structural.singleton;

/** * 餓漢模式-靜態塊

* 優點:

* 實現簡單

* 缺點:

* 不能延時載入,即使單例不會被用到頁會被初始化

* * @author faith.huan 2019-12-02 22:11

*/public

class

eagerstaticblocksingleton

catch

(exception e)

}/**

* 通過私有構造器,限制類的例項化

*/private

eagerstaticblocksingleton()

/** * 通過公有靜態方法,提供全域性訪問入口

*/public

static eagerstaticblocksingleton getinstance()

}

package design.structural.singleton;

/** * 懶漢模式-非執行緒安全

* 優點

* 延時初始化

* 缺點

* 執行緒不安全

* * @author faith.huan 2019-12-02 22:33

*/public

class

lazythreadnotsafesingleton

/** * 通過公有靜態方法,提供全域性訪問入口

*/public

static lazythreadnotsafesingleton getinstance()

return singleton;

}}

解決執行緒安全最簡單的方式就是在靜態方法上加synchronized關鍵字

package design.structural.singleton;

/** * 懶漢模式-執行緒安全

* 優點

* 延時初始化

* 缺點

* 用於每次獲取物件都需要加鎖,效能較差

* * @author faith.huan 2019-12-02 22:33

*/public

class

lazythreadsafesingleton

/** * 通過公有靜態方法,提供全域性訪問入口

*/public

static

synchronized lazythreadsafesingleton getinstance()

return singleton;

}}

針對懶漢模式-執行緒安全版本使用方法級的synchronize關鍵字來實現執行緒安全帶來的效能問題,採用double check lock(dcl)方式來優化。

package design.structural.singleton;

/** * 雙檢查鎖模式-dcl

* 優點

* 延時初始化,執行緒安全

* 缺點

* jdk1.5及以後版本

* * @author faith.huan 2019-12-02 22:33

*/public

class

doublechecklocksingleton

/** * 通過公有靜態方法,提供全域性訪問入口

*/public

static doublechecklocksingleton getinstance()

}}return singleton;

}}

要點: 時間

執行緒a執行緒b

t1a1: 分配物件記憶體空間

t2a3: 設定singleton指向剛分配的記憶體位址

t3b1:判斷 singleton是否為null

t4b2: 由於singleton不為null

執行緒b將訪問singleton物件

t5a2:初始化物件

package design.structural.singleton;

/** * 靜態內部類

* 比爾.普格

* * @author faith.huan 2019-12-03 22:16

*/public

class

billpughsingleton

/** * 通過靜態內部類實現單例

* 只有當getinstance方法呼叫時,singletonholder才會被載入

*/private

static

class

singletonholder

/** * 通過公有靜態方法,提供全域性訪問入口

*/public

static billpughsingleton getinstance()

}

package design.structural.singleton;

/** * 列舉模式

* * @author faith.huan 2019-12-03 22:26

*/public

enum enumsingleton

Java設計模式之單例模式(Singleton)

前言 在總結okhttp的時候,為了管理網路請求使用到了單例模式,晚上實在沒啥狀態了,靜下心來學習總結一下使用頻率最高的設計模式單例模式。單例模式 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例特點 單例分類 1 懶漢單例 1 非執行緒安全實現 public class...

設計模式 建立型模式 單例模式 Singleton

4種單例模式 單執行緒單例 類class single private static single sin null public static single createinstance return sin 呼叫 console.writeline 單執行緒單例模式 single sin sin...

大話設計模式二十一 單例模式(Singleton)

一.單例模式定義 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。二.結構和說明 singleton負責建立singleton類自己的唯一例項,並提供乙個getinstance方法,讓外部來訪問這個類的唯一例項。三.呼叫示例圖 實現 四.控制例項個數 簡單演示如何擴充套件單例模式,控制例項數...