設計模式學習--------6.單例模式學習

單例非常簡單,只說下一些值得注意的地方。


模式一:懶漢式

需要的時候在初始化,時間換空間,每次獲取實例都去判斷是否需要創建實例.非線程安全。

package com.kris.study;

public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance(){
    	if(instance == null){
    		instance = new Singleton();
    	}
    	return instance;
    }
}

模式二:餓漢式

開始就初始化,空間換時間.線程安全,在裝載類時初始化,不會產生併發,因爲虛擬機保證只會裝載一次.

package com.kris.study;

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
    	return instance;
    }
}

如何實現線程安全的懶漢模式:

package com.kris.study;

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

以上是標準的單例實現


高手的單例解決方案:

package com.kris.study;

public class Singleton {
    private static class SingletonHolder{
    	private static Singleton instance = new Singleton();
    }
    
    private Singleton(){}
    
    public static Singleton getInstance(){
    	
    	return SingletonHolder.instance;
    }
}


當getInstance方法第一次被調用時,它第一次讀取SingletonHolder.instance,導致SingletonHolder類得到初始化,而這個

類在裝載並被初始化的時候,會初始化他的靜態域,從而創建Singleton實例,由於是靜態域,因此在裝載時才初始化一次.

並由虛擬機來保證線程安全。而且getInstance方法沒有被同步.因此不會增加額外的成本.


單例和枚舉:

Effective JAVA中提倡用枚舉實現單例

package com.kris.study;

public enum Singleton {
	INSTANCE;
    public void singletonOperation(){
    	//功能處理
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章