單例模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。
什麼情況下需要單例模式?
一些類提供公共功能供別人呼叫,本身不會處理業務邏輯
類會被許多類和執行緒呼叫
單例模式的一些注意點:
單例的生存期超長,會導致記憶體的持續占用。
單例在多執行緒環境需要小心的處理執行緒互斥,進行資源保護。
單例在類的繼承樹中不利於使用,會破壞繼承體系。
單例的全域性可見性帶來的設計破壞。
經典**示例以及改進:
public class singleton
return uniqueinstance;
}private singleton()
}
上面的**實現了延遲載入(假如乙個單例類需要耗費好多資源時候延遲載入就有很大好處)但是這種做法在多執行緒的時候會出現問題,比如有兩個執行緒同時呼叫getinstance(),這時會new兩個物件。
把getinstance()方法變成同步(synchronized)方法:
public class singleton
return uniqueinstance;
}private singleton()
}
但是同步會降低效能。
綜合考慮有以下幾種解決方案:
1、如果getinstance()的效能對程式不是很關鍵,那就不用考慮太多。
2、不用延遲例項化的方法。
public class singleton
private singleton()
}
3、雙重檢查加鎖,在getinstance()中減少使用同步。
public class singleton }}
return uniqueinstance;
}private singleton()
}
為什麼需要兩次判斷為null?
其實這個意義在於防止多個執行緒同時進入第乙個if內,比如說執行緒a執行到a行,執行緒b執行到b行,執行緒b還沒有返回。當執行緒a執行到c行,這時執行緒b初始化例項完畢,如果沒有裡面的再一次判斷就會生成兩個例項!
其他需要注意點事項:
1、單例模式和靜態類(把所有的方法和變數都定義成靜態的)的區別
2、如果程式中存在多個類載入器,則不同的類載入器有可能載入同乙個類,這種情況下就會出現多個單例類例項並存。這種情況下則需要自行指定類載入器,並指定同乙個類載入器。
設計模式系列 單例模式
單例模式就是指單例類在一定的生命週期內只能有乙個物件例項,單例類的建立必須是本身,並能給使用者提供自身。在現實世界中,每個生命體都可以被看做是乙個單例物件,唯一且具體,具有不可複製性。同樣的,在軟體開發領域中,有時我們需要保證客戶端在當前的客戶機上只能執行乙個例項這個時候,我們就應該考慮使用單例模式...
設計模式系列 單例模式
今天單位有自己的食堂啦,發郵件收了工卡之後統一拿去啟用,以後就用工卡去食堂吃飯啦,早上2元,中午10元,晚上3元,都是自助噢,很爽,不過還是有一推人沒有第一時間啟用卡,也有的人啟用卡了忘記自己啟用了,我就是其中乙個,無奈下我只好到食堂自己去啟用卡了,餐廳只有乙個機會卡的櫃檯所以啟用的時候需要排隊,還...
設計模式系列之單例模式
在設計模式中,單例模式是屬於比較簡單是卻很實用的一種設計模式,單例模式的含義就是乙個類在程式中只能有不多於1個物件。但是看似簡單的單例模式,一不小心就會出現一些難以發現的隱藏bug。問題一 系統擁有多個類載入器 當系統擁有多個類載入器的時候,而又同時使用單例模式,解決辦法就是 為單例的類和單例類指定...