單例模式,最好的單例實現方式,靜態內部類的方式
阿新 • • 發佈:2018-11-19
單例模式的優點:
1.在記憶體中只有一個物件,節約記憶體
2.避免頻繁的建立和銷燬物件,可以提高效能
3.避免對共享資源的多重佔用
4.可以全域性訪問
適用場景:
1.需要頻繁例項化然後銷燬的物件
2.建立物件時,耗時過多或者耗資源過多,但又經常用到的物件
3.有狀態的工具類物件
4.頻繁訪問資料庫或檔案的物件
5.要求只有一個物件的場景
靜態內部類的方式實現單例
/* * 單例模式,確保一個類只有一個例項,而且自動例項化,並向整個系統提供整個例項。 * 三個優點 * 1.jvm虛擬機器本身的機制,保證了資料的執行緒安全 * 2.沒有使用關鍵字,synchronized,雖然這個關鍵字能保證執行緒安全,但是他非常的影響效能, * 因為他只有一個執行緒能讀取裡面的資料,另一個執行緒就不能讀取,靜態內部類的方式,可以同時讀取 * jvm本身的機制保證了執行緒安全,沒有效能缺陷 * 3.SingletonHolder類是私有的,只有getInstance()能對其進行訪問 */ /* * 第一次載入這個StaticInnerSingleton的時候,他不會初始化instance, 只有他第一次呼叫 getInstance() * 這個方法之後,虛擬機器才會載入SingletonHolder類, 並初始化instance,這樣不僅能保證執行緒安全,也能保證single類的唯一性。 */ /** // 靜態內部類 * jvm提供的同步控制 static final static 區塊初始化資料,保證資料在記憶體中是獨一份的 final * 變數初始化完成之後就無法被修改,所以final也是執行緒安全的 * * 我們利用的是jvm進行類載入的時候會保證資料同步,所以我們就利用內部類原理, * 在內部類裡建立物件的例項,這樣只要我們的應用中不使用這個內部類StaticInnerSingleton, * 那麼jvm虛擬機器他就不會去載入這個類,也就不會去建立我們所要建立的單例物件Instance,從而 * 這裡靜態內部類,就完成了懶漢式的延遲載入,同時又保證了執行緒安全 */ public class StaticInnerSingleton { private StaticInnerSingleton() { } public static StaticInnerSingleton getInstance() { return SingletonHolder.mInstance; } private static class SingletonHolder { private static final StaticInnerSingleton mInstance = new StaticInnerSingleton(); } }