單例模式定義
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體。即一個類只有一個對象執行個體
單例模式的實現方式: 懶漢式實現,不過多線程下不安全
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
懶漢式實現2:安全執行緒(添加synchronied關鍵字)(然而遺憾的是多線程執行效率很低,大多數情況下不需要使用多線程)
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
餓漢式實現:安全執行緒(因為在類載入時就直接建立了該類的單例對象,所以不會因為多線程的原因而導致對象的不同,不過該實現方式顯然沒有實現lazy loading的效果)
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
餓漢式變種(同第三種類似,不同的是初始化的順序)
public class Singleton { private Singleton instance = null; static { instance = new Singleton(); } private Singleton (){} public static Singleton getInstance() { return this.instance; } }
靜態內部類:(實現了lazy loading的效果,因為在外部類裝載的時候,靜態內部類還沒有被使用,當調用了該外部類的getInstance方法時才會裝載該靜態內部類,從而產生單例模式的該外部類執行個體)
public class Singleton { //外部類裝載的時候,在沒有調用getInstance方法之前該內部類是不會被裝載的,因此也實現了lazy loading的效果 private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
枚舉:(用的少)
雙重檢驗鎖:安全執行緒程度最高的單例模式實現,不過並不能保證他在單一處理器或者多處理器電腦上正常運行,這歸咎於java平台的記憶體模型允許的所謂“無序輸入”
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { //以防多線程並發,對當前class進行鎖定 synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
單例模式使用情境:
串連資料庫的時候就使用的是單例模式
Servlet容器就使用的單例模式