原文: 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。