1. 程式人生 > >單例模式常用三種寫法

單例模式常用三種寫法

餓漢式(空間換時間)

public class Singleton {
    //加static讓getInstance方法呼叫
    private static Singleton single = new Singleton();

    //私有化建構函式,防止外部直接new物件
    private Singleton() {
    }

    //對外提供方法獲取單例物件
    public static Singleton getInstance() {
        return single;
    }
}

懶漢式(時間換空間)

public class Singleton {
    //volatile僅僅用來保證該變數對所有執行緒的可見性,但不保證原子性
private static volatile Singleton singleton = null; private Singleton() { } //雙重檢查,保證多執行緒操作安全 public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new
Singleton(); } } } return singleton; } }

靜態內部類(時間換空間)

public class Singleton {

    private Singleton() {

    }

    private static class Internal {
        private static Singleton instance = new Singleton();
    }

    public static Singleton getInstance
() { return Internal.instance; } }

對JVM而言,外部類和靜態內部類是兩個平等的物件,外部類被載入時靜態內部類並不需要立即被載入,靜態內部類不被載入則不需要進行類初始化,因此單例物件在外部類被載入了以後也不佔用記憶體,起到了懶載入的效果。