【設計模式一】單例模式,最好的單例實現方式,靜態內部類的方式

單例模式的優點:

    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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章