單例模式的7種實現方式及比較

2021-09-12 19:11:48 字數 1809 閱讀 5963

多個執行緒要操作同一物件,需要保證物件的唯一性。

為了更好的對下面即將介紹的幾種實現方式進行比較,我們定義幾個考量維度:執行緒的安全線、是否懶載入、效能

方法一:餓漢式單例模式【可用】

public class badmashsingleton 

public static badmashsingleton getinstance()

}

方法二:懶漢式單例模式【多執行緒有問題】
public class idlersingleton 

// 在使用時才進行載入

public static idlersingleton getinstance()

return instance;

}}

是否懶載入:懶載入

效能:效能比較好

public class idlersynsingleton 

public static synchronized idlersynsingleton getinstance()

return instance;

}}

方法四:懶漢式單例模式+同步**塊【不可用】

該方法是對上面方法的乙個優化,將同步方法改為同步**塊。

public class idlersynsingleton 

public static idlersynsingleton getinstance()

}return instance;

}}

是否懶載入:懶載入

效能:效能一般

方法五:dcl單例模式+volatile【可用】

為了解決方法四存在的執行緒不安全問題,我們引入雙重鎖,即double-check-locking。同時引入volatile關鍵字修飾例項物件,這是為了避免因jvm指令重排序可能導致的空指標異常。因為當執行緒執行到第乙個if (null == instance)時,**可能讀取到instance不為null,但此時instance引用的物件可能還沒有完成初始化。

public class dclsingleton 

public static dclsingleton getinstance() }}

return instance;

}}

宣告類時,成員變數中不宣告例項變數,而是放到靜態內部類中。這種方式和懶漢式有些相似,它們都採用了類裝載的機制來保證初始化例項時只有乙個執行緒,不同的是,holder單例模式是將例項的初始化放到了靜態類中去實現,從而實現了懶載入。

public class holdersingleton 

public static holdersingleton getinstance()

private static class holder

}

借助了enum列舉類的特性,直接解決了多執行緒同步問題。

public class enumsingleton 

public static enumsingleton getinstance()

private enum enumholder

private enumsingleton getinstance()

}}

7種方式實現單例模式

單例模式,即是整個類有且只有乙個類例項,通過這個唯一的例項為全域性提供服務。單例類的構造方法為私有的,通過乙個暴露給外界的獲取例項方法來呼叫私有構造方法,保證例項的唯一性。因為餓漢式單例在類載入時就初始化了唯一的例項 且只會初始化一次,所以,該例項是唯一的,即 執行緒安全的 因此,如果我們想要為例項...

單例模式的7種實現方式

多個執行緒要操作同乙個物件,保證物件的唯一性,例項化過程只例項化一次 解決的思路 在載入類時就例項化乙個物件 public class singleton1 public static singleton1 getintance 特點用這個物件的時候才去例項化 public class hoonsi...

單例模式實現方式比較

單例模式實現方式 執行緒安全 延遲載入 反射安全 序列化安全 餓漢模式 懶漢模式 非空判斷 懶漢模式 方法加鎖 懶漢模式 雙重檢查鎖 靜態內部類 列舉 餓漢 author zhouxiaobing public class singleton implements serializable priv...