1. 程式人生 > >內部類——實現單例

內部類——實現單例

內部類實現單例

使用內部類方式實現單例,既可以做到延遲載入,又不必使用同步關鍵字,是一種比較完善的實現。

——Java程式效能優化

先來看看,使用內部類實現單例,是如何實現的?

// 執行緒安全,支援延遲載入
public class StaticSingleton {
	
	private StaticSingleton() { /*……*/}
	
	private static class SingletonHolder {
		private static StaticSingleton instance = new StaticSingleton();
	}
	
	public static StaticSingleton getInstance() {
		return SingletonHolder.instance;
	}
}

延遲載入StaticSingleton類被載入時,不會執行內部類的方法,因而,不會立即返回具有實質內容的例項物件。這時的物件,我暫且將其稱為空物件。

     這就好比,一個實體類物件entity,即使被執行了例項化操作即Entity entity = new Entity(),但此時的entity僅僅是Entity的一個模型,沒有資料填充。只有為該entity物件進行了賦值,才是一個充實的實體物件。

     上面的單例正是這種感覺,StaticSingleton類載入時,是不會生成充實物件的。而只有到了,真正呼叫getInstance()時,才會去進行資料填充(真正生成‘具有內容’的物件例項),轉變成實質物件。

執行緒安全:單執行緒與多執行緒執行相同的程式,所得的結果是一致的,那麼我們稱程式是執行緒安全的。

     空物件在類載入時已經生成,在呼叫getInstance()時,則轉變成實質物件。因而,是執行緒安全的。

     不管是第一次使用時,得到的僅僅只是一個空盒子,需要等待往盒子裡面填充資料後,成為滿盒子,再進行使用。或者是再次使用時,用的是之前填充好資料的滿盒子。兩次相遇的初次碰面不一樣,但使用的實際物件是同一個。創造的目的在於運用。真正運用時,兩次使用的是同一個。因而,是執行緒安全的。


說說 餓漢式與懶漢式(各自存在的短板,內部類方式 友好解決了):

餓漢式:是執行緒安全的;類載入的時候,就會生成例項物件,未支援 延遲載入,在還未用到之前,一直佔用記憶體。

懶漢式:支援延遲載入;在多執行緒條件下,存線上程安全問題。