多種實現單例的方式,但都具備以下概念。
餓漢模式
餓漢模式-靜態塊
懶漢模式-非執行緒安全
懶漢模式-執行緒安全
雙檢查鎖模式-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方法,讓外部來訪問這個類的唯一例項。三.呼叫示例圖 實現 四.控制例項個數 簡單演示如何擴充套件單例模式,控制例項數...