單例模式:三-靜態內部類模式(Holder)

原文: Gerrard_Feng安全

思想:多線程

  相比於懶漢以及餓漢模式,靜態內部類模式(通常也被稱爲 Holder)是許多人推薦的一種單例的實現方式,由於相比懶漢模式,它用更少的代碼量達到了延遲加載的目的。優化

  顧名思義,這種模式使用了一個私有的靜態內部類,來存儲外部類的單例,這種靜態內部類,通常稱爲 Holder。線程

  而利用靜態內部類的特性,外部類的 getinstance() 方法,能夠直接指向 Holder 持有的對象。code

public final class StaticInnerSingleton {

private StaticInnerSingleton() {
    if (SingletonHolder.instance != null) {
        throw new IllegalStateException();
    }
}

private static class SingletonHolder {
    private static StaticInnerSingleton instance = new StaticInnerSingleton();
}

public static StaticInnerSingleton getInstance() {
    return SingletonHolder.instance;
}

}
  • 反射可否打破單例?

  首先,對外部類的私有構造器中加入 instance==null 的判斷,防止反射入侵外部類。對象

  其次,靜態內部類保證了從外部很難獲取 SingletonHolder 的 Class 對象,從而保證了內部類不會被反射。blog

  • 多線程可否打破單例?

  Holder 模式借用了餓漢模式的優點,就是在加載類(內部類)的同時對 instance 對象進行初始化。生命週期

  因爲自始至終類只會加載一次,因此即便在多線程的狀況下,也可以保持單例的性質。內存

  • 優點?劣勢?get

    優點:兼顧了懶漢模式的內存優化(使用時才初始化)以及餓漢模式的安全性(不會被反射入侵)。

    劣勢:須要多加載一個類;相比於懶漢模式,Holder 建立的單例,只能經過 JVM 去控制器生命週期,不能手動 destroy。

相關文章
相關標籤/搜索