【GOF】單例模式singleTon的再認識

    一直在用單例模式,但是也不清楚爲什麼用它,它能給系統帶來什麼樣的性能提升,當再次用到它的時候,決定要好好研究一下,也給自己留下點影響!

    使用單例的目的是爲了避免不一致問題,防止狀態變化!簡單說來就是,防止我們頻繁初始化類的時候造成數據狀態不一致的問題,通過單例模式可以保證類的唯一性。

☆特性

    1.單例類只能有一個實例;

    2.單例類必須自己創建自己的唯一實例;

    3.單例類給其他所有對象提供這一實例;

單例分類

    ·餓漢式

public class Singleton1 {  
    private Singleton1() {}  
    private static final Singleton1 single = new Singleton1();  
    //靜態工廠方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  
}  

    ·懶漢式

public class Singleton {  
	    private Singleton() {}  
	    private static Singleton single=null;  
	    //靜態工廠方法   
	    public static Singleton getInstance() {  
	         if (single == null) {    
	             single = new Singleton();  
	         }    
	        return single;  
	    }  
	} 

餓漢式和懶漢式的比較

     餓漢式,顧名思義就是“有則生產,生產則使用”;而懶漢式會根據內存中的情況來創建;

 

餓漢

 

懶漢

線程安全

餓漢式天生就是線程安全的,可以直接用於多線程而不會出現問題,

 

懶漢式本身是非線程安全的,爲了實現線程安全可以通過synchronized 關鍵字實現、雙重檢查鎖定、靜態內部類,這三種實現在資源加載和性能方面有些區別。

資源加載和性能

餓漢式在類創建的同時就實例化一個靜態對象出來,不管之後會不會使用這個單例,都會佔據一定的內存,但是相應的,在第一次調用時速度也會更快,因爲其資源已經初始化完成,

 

而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候纔會實例化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之後就和餓漢式一樣了

延伸

    由於懶漢式不能夠保證線程安全,所以可以通過以下方式來彌補其缺陷:

1.synchronized 關鍵字

public static synchronized Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
}

2.雙重檢查鎖定

public static Singleton getInstance() {  
        if (singleton == null) {    
            synchronized (Singleton.class) {    
               if (singleton == null) {    
                  singleton = new Singleton();   
               }    
            }    
        }    
        return singleton;   
    } 

3.靜態內部類

public class Singleton {    
    private static class LazyHolder {    
       private static final Singleton INSTANCE = new Singleton();    
    }    
    private Singleton (){}    
    public static final Singleton getInstance() {    
       return LazyHolder.INSTANCE;    
    }    
}  
    以上便是對GoF中的單例模式的一些解讀,甚是基礎,也是對之前學習的一個總結和鞏固!相比每次很菜的new class的時候,單例模式確實會提高一些系統的性能,儘管很渺小,但是這就是我們對完美的追求。



參考:http://blog.csdn.net/jason0539/article/details/23297037/

    

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