【趣解】單例模式之雙重鎖、內部類、枚舉

說完單例模式基礎之後,現在來說說加強版(回顧基礎版

既然懶漢式和餓漢式都有優缺點,那能不能綜合一下呢?

雙重鎖:既然懶漢式有線程安全問題,即兩個女生同時和一個男生結婚,他們都滿足“男生之前沒有領過證”的條件,怎麼樣避免呢?很簡單,你們兩個不要同時一起,一個一個按順序來即可,代碼如下:

/**
 * 雙重鎖,懶漢式加強,保證一夫一妻。
 */
public class Husband03 {
	//這句話看起來很奇怪,就理解爲一開始每個男人都是沒有老婆的
	private static Husband03 wife = null;
	//私有化老公,讓小三無法擁有
	private Husband03(){}
	
	//當家里人找你要老婆的時候
	public static Husband03 getWife(){
		if(wife == null){//兩個女生同時來和一個男生領結婚證。
			synchronized (Husband03.class) {//法官:等一下,你們一個一個來。
				if(wife == null){//檢查男生是否已經領證。
					wife = new Husband03();
				}
			}
		}
		return wife;
	}
}

內部類:加synchronized會很影響效率(下一講具體解說),那麼如何讓男生既在結婚前只用花一個人的錢,又能讓男生不找小三呢?月老!提前把男生和女生綁在一起,告訴男生你已經有老婆了,等你需要的時候來找我要(線程安全),而且在男生不想找老婆之前不用知道到底是誰,只用花一個人的錢!(節約資源)

java代碼如下:

/**
 * 內部類
 */
public class Husband04 {
	//月老:男生女生已經牽了紅繩,隨時來取。
	private static class WifeClass{
		private static final Husband04 wife = new Husband04();
	}
	//私有老公,讓小三無法擁有
	private Husband04(){}
	
	//當家里人找你要老婆的時候,直接找月老要紅繩的名單就可以了。
	public static Husband04 getInstance(){
		return WifeClass.wife;
	}
}
枚舉類:枚舉式本身就是一種單例模式(官方提供,非常安全,可理解爲餓漢式的強化版)

public enum Husband05 {
	WIFE;
}
這三種方法都在不同程度上綜合懶漢式、餓漢式的優點,至於5種方法的效率,安全性以及什麼情況下使用哪種方式,請看5種單例模式的安全性問題 與 5種單例模式的效率問題



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