Java面試題設計模式篇單例模式
阿新 • • 發佈:2019-02-17
1 餓漢式-不要求延遲載入的情況下使用
餓漢方式一:Enum
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
餓漢方式二:靜態類變數
如果不需要延遲初始化,餓漢式可以接受,那麼可以採用下面的簡單方法實現:
- 執行緒安全
- 實現簡單
- 類載入時便初始化例項
- instance為靜態變數,利用靜態變數實現單例模式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
2 懶漢式-明確需要延遲載入情況下
如果不想提前初始化例項,直到使用的時候才初始化。那麼採用懶漢式,相對複雜些。
懶漢方式一:靜態內部類延遲特性
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
- 靜態內部類本身延遲載入,只有呼叫時才會初始化
- instance變數依舊式利用類的靜態變數保證單例實現,無法利用靜態內部類實現延遲載入,
懶漢方式二:雙重檢查鎖延遲初始化
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }