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