Head First Design Pattern 讀書筆記(4) 單例模式

Head First Design Pattern 讀書筆記(4) Singleton Pattern 單例模式

###Silngleton Pattern 類圖 單例模式很是簡單,基本沒有什麼類之間的關係,就不畫圖了,保證某個類生成的實例只有一個便可。java

###定義安全

  1. 單例模式:只容許一個類實例化一個對象,並提供一個能夠全局訪問這個實例的方法(接口)。

###關於單例模式多線程

  1. 最簡單的單例模式實現方法是:
/*
*「懶漢式」寫法,即等要用了再去實例化實例對象,而不是應用一啓動就實例化好放在容器中。
*/
public class Singleton {
	private Singleton();
	private static Singleton instance;
	public static getSingleton(){
		if(instance==null){
			instance = new Sinleton();
		}
		return instance;
	}
}
  1. 1中實現的singleton在多線程中可能會有多個線程同時實例化,致使實例對象不止一個的問題,解決方案是使用同步鎖,或者使用「餓漢式」的寫法。
//雙重檢查鎖的寫法,由於使用了volatile關鍵字,須要jdk1.4以上
public class Singleton {
	private Singleton();
	private static volatile Singleton instance;
	public static getSingleton(){
		if(instance==null){
			synchronized (Singleton.class){
				if(instance==null){
					instance = new Sinleton();
				}
			}
		}
		return instance;
	}
}

/**
* 「餓漢式」的寫法,由於沒用到同步鎖,因此後期效率最高。
**/
public class Singleton {
	private Singleton();
	private static Singleton instance = new Singleton();
	public static getSingleton(){
		return instance;
	}
}

  其實所謂「懶漢式」與「餓漢式」的寫法,只是區別在初始化的時機而已。「餓漢式」寫法由jvm保證一應用啓動時只實例化一個對象,因爲多了一步實例化操做,應用啓動會稍微慢點。而「懶漢式」因爲是在應用啓動後實例對象,因此要考慮多線程併發的狀況。對於不是很大的應用,我的偏向於「餓漢式」,畢竟啓動的時候多花點時間啓動,換來後期運行的安全與效率也是值得的。誰沒事每天重啓生產上的程序啊(╯‵□′)╯︵┻━┻ 。併發

相關文章
相關標籤/搜索