设计模式----单例模式实例
單例模式通常分懶漢和餓漢兩種模式。
1、懶漢單例模式
? ? ? ? ?可以理解為懶漢模式創建的類,非常懶,只有在被調用時才會判斷自身是否已有對象,如果沒有就立即創建自身對象,然后返回。如果已有對象就立即返回。
public Class Single{private static Single intance = null;private Single(){};//私有默認構造器public static synchronized Single getIntence(){//添加同步鎖,防止多線程同時進入造成多次實例化if(intence==null){intance = new Single();}return intance;} }????????? ? 優點:調用時才會初始化,避免資源浪費。
????????? ? 缺點:加了synchronized鎖,影響效率?。? ?? ??
?
2、餓漢單例模式
? ? ? ? 可以理解為餓漢模式創建的類都很饑渴,在類加載的時候就創建對象。
public Class Single{private static Single intance = new Single();//當類加載時就調用自身private Single(){};public static Single getIntance(){return intance;} }? ? ? 優點:1、線程安全,在類加載時創建實例不存在在運行過程中,多個線程創建多次實例,避免了多線程同步的情況。
????????????? ?2、調用時速度快。
????? 缺點:資源效率不高,如果之后沒有用到getinstance()的話,會造成資源浪費。
?
下面介紹幾種單例模式為常用細分類:
????? ?1、懶漢模式不安全(lazy loading)
????? ? 嚴格意義上不是單例模式,這種模式不能在多線程環境下使用。
public Class Single{private static Single instance;private Single();public static Single getInstance(){ //未加安全鎖,大家一起用if(instance == null){instance = new Single();}return instance;} }? ? ? 很明顯這種方式不適合在多線程下使用。
????? ? 下面這幾種都適合多線程使用。
? ? ? ?2、雙重檢驗鎖/雙檢鎖
? ? ? ?他是懶漢的一種,這種方式采用了雙鎖機制,在安全下保持高性能。
public Class Single{private static Single instance;private Single();public static Single getInstance(){if(instance == null){synchronized(Single.class);if(instance == null){instance = new Single();}}}}? ? ? ? 可在實例域需要延遲初始化的時候使用。
? ? ? ? 3、登記式/靜態內部類
? ? ? ? 對靜態域進行延遲初始化應用這種方式而不用雙檢鎖。
public Class Single{private static class SingleHandler{private static final Single instance = new Single();}private Single(){};public static final Single getInstance(){return SingleHandler().instance;} }? ? ?這種方式就是Single類被加載后,instance不一定被實例化。如果實例化 instance 很消耗資源,所以想讓它延遲加載,另外一方面,又不希望在 Singleton 類加載時就實例化,因為不能確保 Singleton 類還可能在其他的地方被主動使用從而被加載,那么這個時候實例化 instance 顯然是不合適的。
? ? ? ? ?4、枚舉
? ? ? ? ?這種方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不僅能避免多線程同步問題,而且還自動支持序列化機制,防止反序列化重新創建新的對象,絕對防止多次實例化。他不具有懶漢的特性。由于 JDK1.5 之后才加入 enum 特性,在實際工作中,很少用。
? ? ? ? ? ? 不能通過 reflection attack 來調用私有構造方法。
public enum Single(){instance;public void method(){} }總結??
? ? ? ? ?通常,不建議使用懶漢模式不安全和synchronizad懶漢方式,建議使用餓漢方式。只有在要明確實現 lazy loading 效果時,才會使用登記式。如果涉及到反序列化創建對象時,可以嘗試使用枚舉方式。如果有其他特殊的需求,可以考慮使用雙檢鎖方式。
總結
以上是生活随笔為你收集整理的设计模式----单例模式实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式-----单例模式优缺点及使用场
- 下一篇: 架构设计模式