Java23種設計模式之「單例模式」
阿新 • • 發佈:2020-07-22
單例模式 之 holder 模式 (推薦)
/** * 單例模式 之 holder 模式 * 帶有 Holder 的方法, * 類級內部類,靜態的成員內部類,該內部類的例項與外部類的例項沒有繫結關係 * 只有在呼叫的時候才會被封裝,從而實現了延遲載入,即懶漢式 * * holder方式的單例模式是最好的設計之一,也是目前用的比價廣泛的設計之一 * * 優點: * * 缺點: * * 注: * final 修飾,不允許被繼承 * * @author Mr.Lim */ public final class SingletonModeOfHolder { private static class SingletonModeOfHolderIn { /** * 靜態初始化,由JVM來保證執行緒安全 */ public static final SingletonModeOfHolder INSTANCE = new SingletonModeOfHolder(); } public static SingletonModeOfHolder getInstance() { return SingletonModeOfHolderIn.INSTANCE; } public SingletonModeOfHolder() { } }
單例模式 之 飽漢模式(懶漢模式)
/** * 單例模式 之 飽漢模式(懶漢模式) * * 優點: * 啟動快,資源佔用小,使用時才例項,無鎖 * * 缺點: * 非執行緒安全的,多執行緒下不能保證單例的唯一性 * * 注: * final 修飾,不允許被繼承 * * @author Mr.Lim */ public final class SingletonModeOfFull { private static SingletonModeOfFull instance = null; public SingletonModeOfFull getInstance () { if (instance == null) { instance = new SingletonModeOfFull(); } return instance; } public SingletonModeOfFull() {} }
單例模式 之 雙重鎖檢查 (Double Check Lock)
/** * 單例模式 之 飽漢模式(懶漢模式) 執行緒安全 雙重鎖檢查 (Double Check Lock) * * 優點: * 懶載入,執行緒安全 * * 缺點: * * 注: * 例項必須有 volatile 關鍵字修飾,保證初始化完全,保證了變數的可見性(visibility) * 被 volatile 關鍵字修飾的變數,如果值發生了變化,其他執行緒立馬可見 * * @author Mr.Lim */ public final class SingletonModeOfFullDCL { private volatile static SingletonModeOfFullDCL instance = null; public static SingletonModeOfFullDCL getInstance() { // 判斷例項是否存在,如果不存在進入下面的同步塊 if (instance == null) { // 同步 執行緒安全的建立例項 synchronized (SingletonModeOfFullDCL.class) { // 再次檢查例項是否存在 if (instance == null) { instance = new SingletonModeOfFullDCL(); } } } return instance; } public SingletonModeOfFullDCL() {} }
單例模式 之 飽漢模式(懶漢模式) 執行緒安全
/**
* 單例模式 之 飽漢模式(懶漢模式) 執行緒安全
*
* 優點:
* 啟動快,資源佔用小,使用時才例項,有鎖
*
* 缺點:
* synchronized 為獨佔排他鎖,併發性差,即使在建立成功之後,獲取例項仍然是序列化操作
*
* @author Mr.Lim
*/
public final class SingletonModeOfFullSafe {
private static SingletonModeOfFullSafe instance = null;
public static synchronized SingletonModeOfFullSafe getInstance() {
if (instance == null) {
instance = new SingletonModeOfFullSafe();
}
return instance;
}
public SingletonModeOfFullSafe() {}
}
單例模式 之 餓漢模式
/**
* 單例模式 之 餓漢模式
*
* 優點:
* 餓漢模式天生是執行緒安全的,使用時沒有延遲
*
* 缺點:
* 時候即建立例項,啟動慢,有可能造成資源浪費
*
* @author Mr.Lim
*/
public final class SingletonModeOfHungry {
/**
* 類載入即建立物件
*/
private final static SingletonModeOfHungry INSTANCE = new SingletonModeOfHungry();
/**
* 提供給外接獲取物件的方法
*/
public static SingletonModeOfHungry getInstance() {
return INSTANCE;
}
/**
* 私有化構造器 防止外接建立物件
*/
private SingletonModeOfHungry() {
}
}