單例模式

定義:
一個應用只產生一個實例
通用代碼1-餓漢模式(缺點:instance是在類加載時初始化,如果初始化太早造成資源浪費)
public class Singleton(){
private static final Singleton singleton=new Singleton();
//限制產生多個對象
private Singleton(){}
//獲得實例對象
public static Singleton getSingleton(){
return singleton;
}
//其他方法,儘量static
public static void doSomething(){
}
}
通用代碼2-懶漢模式
public class Singleton(){
private static Singleton instance=null;
private Singleton(){}
private static Singleton getInstance(){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
return instance;
}
}
通用代碼3-2代碼優化方案
public class Singleton(){
private static Singleton instance=null;
private Singleton(){}
private static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
通用代碼4
public class Singleton{
private static volatile Singleton instance=null;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
volitile指令重排,就是在對它賦值操作完成之前,不會調用讀方法
通用代碼5
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
優點:
1.單例模式在內存中只有一個實例,減少了內存的開支,特別是對象需要頻繁地創建、銷燬時,而且創建或銷燬時性能又無法優化
2.單例模式只產生一個實例,所以減少了系統的性能開銷,當一個對象的產生需要比較多的資源時,如讀取配置、產生其他依賴對象時,則可以通過應用啓動時直接產生一個單例對象,然後永久駐留的方式來解決
3.單例模式可以避免對資源的多重佔用,避免對同一個資源文件的同時寫操作
4.單例模式可以在系統設置全局訪問點,優化和共享資源訪問
缺點
1.單例模式一般沒有接口,擴展很困難
2.單例模式對測試不利
3.單例模式與單一職責模式衝突
應用場景
1.系統中,要求一個類有且僅有一個對象,如果出現多個對象將會出現不良反應
2.要生成唯一序列化的環境
3.在整個項目中需要一個共享訪問點或共享數據
3.創建一個對象需要消耗很多資源
4.需要定義大量的靜態常量和靜態方法
注意事項
1.在高併發環境中,注意單例模式的線程同步問題
不安全實例
public class Singleton{
private static Singleton singleton=null;
public Singleton(){}
public static Singleton getSingleton(){

if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
高併發中,如一個線程執行到創建單例時,但還沒有獲得對象但是第二個對象也到了這裏了,就都創建了對象
解決,getSingleton()添加synchronized

類圖:

發佈了64 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章