單例模式學習

2021-09-30 20:39:28 字數 1898 閱讀 7302

單例模式實現

一.實現雙重校驗鎖

public class singleton   

public static singleton getsingleton()

} }

return singleton;

} }

特點:通過關鍵字synchronized保證高併發下,初始化物件為單例。缺點效能較差,物件屬性需要volatile進行修飾防止編譯期間指令重排序,導致返回物件為null。

二.通過類載入機制

public class singleton   

public static singleton getinstance()

}

或public class singleton

private singleton (){}

public static singleton getinstance()

}

特點:餓漢模式,classloader的loadclass方法在載入類的時候使用了synchronized關鍵字。也正是因為這樣, 除非loadclass被重寫,這個方法預設在整個裝載過程中都是同步的(執行緒安全的),保證方法呼叫前已被初始化一次。

三.利用內部類

public class singleton   

private singleton (){}

public static final singleton getinstance()

}

特點:使用靜態內部類,借助了classloader來實現了執行緒安全,這與餓漢模式有著異曲同工之妙,但是他有兼顧了懶漢模式的lazy-loading功能,相比較之下,有很大優勢。

四.利用列舉

public enum singleton   

}

特點:解決通過反序列化導致單例破壞,**簡潔。

五.通過cas

public class singleton 

public static singleton getinstance()

singleton = new singleton();

if (instance.compareandset(null, singleton)) }}

}

特點:不通過鎖的機制。

問題:單例的破壞

public class test  catch (ioexception e) 

system.out.println(instance);

system.out.println(instance2);

}}

/**

* @descrption

* @classname eagersingleton

* @author qiu_lijun

* @date 2019/5/23 17:53

* @version 1.0

*/public class eagersingleton implements serializable

// 靜態工廠方法

public static eagersingleton getinstance()

/* public object readresolve() */

}

在呼叫readobject方法中,會利用反射回去物件例項。假如為在類中定義readresolve方法,就會返回乙個新的物件。導致單例模式被破壞。解決方法重寫readresolve方法。

單例模式學習

通常情況下我們可以讓乙個全域性變數使得乙個物件被訪問,但不能防止你例項化多個物件,乙個最好的方法就是,讓類自身負責儲存他的唯一例項。這個類可以保證沒有其他例項可以被建立,並且他可以提供乙個訪問該例項的方法。一 經典單例 public class singleton public static sin...

學習單例模式

1 單例模式是怎樣產生的?當想要讓乙個定義類只能例項化乙個物件,則不能對外提供public的構造方法,而是要把構造方法定義為private的,這樣就可以讓定義類自己控制類的例項化。同時,也要對外提供乙個public的方法,用來得到定義類的例項。當然,在定義類的內部需要初始化來建立自身的乙個例項 保證...

單例模式學習

注 學習內容來自劉偉老師的技術部落格 史上最全的設計模式 這個系列的部落格深入淺出,引人入勝,值得學習。1.什麼是單例模式?單例模式 singleton pattern 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全域性訪問的方法。單例模式是一種物件建立...