1. 程式人生 > >單例模式,最好的單例實現方式,靜態內部類的方式

單例模式,最好的單例實現方式,靜態內部類的方式

單例模式的優點:

    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();
    }
}