內部類——實現單例
阿新 • • 發佈:2018-12-26
內部類實現單例
使用內部類方式實現單例,既可以做到延遲載入,又不必使用同步關鍵字,是一種比較完善的實現。
——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()時,則轉變成實質物件。因而,是執行緒安全的。
不管是第一次使用時,得到的僅僅只是一個空盒子,需要等待往盒子裡面填充資料後,成為滿盒子,再進行使用。或者是再次使用時,用的是之前填充好資料的滿盒子。兩次相遇的初次碰面不一樣,但使用的實際物件是同一個。創造的目的在於運用。真正運用時,兩次使用的是同一個。因而,是執行緒安全的。
說說 餓漢式與懶漢式(各自存在的短板,內部類方式 友好解決了):
餓漢式:是執行緒安全的;類載入的時候,就會生成例項物件,未支援 延遲載入,在還未用到之前,一直佔用記憶體。
懶漢式:支援延遲載入;在多執行緒條件下,存線上程安全問題。