1. 程式人生 > >幾種常用的單例模式

幾種常用的單例模式

單例模式的作用是使該類在全域性中只存在一個例項。目的是當有其他類需要訪問時,不需要重複建立該例項,並且可以共享該類資料。

1.餓漢式

public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }
}

優點:在類載入時,就建立單例例項,避免的執行緒同步化。 缺點:可能後面不會使用該類,沒有達到延遲載入,造成記憶體資源的浪費。

2.懶漢式


public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

雖然起到了懶載入的作用,但是隻能在單執行緒下使用。多執行緒使用可能導致建立多個例項。

3.雙重檢查式

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

優點:延遲載入,安全,效率高。 在例項化時,會先判斷是否為空,在進一步加鎖判斷是否為空。如果例項化成功,後續呼叫該靜態例項時,就不需要在進入加鎖程式碼塊。

4.靜態內部類

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

該方法在類裝載時,不會立即例項化,需要呼叫靜態內部類後,才完成例項化。因為類的靜態屬性只會在類第一次載入的時候初始化,JVM保證了執行緒的安全性,在類初始化時,其他執行緒無法進入。