1. 程式人生 > >單例模式更好的寫法

單例模式更好的寫法

特別說到這個問題,是因為網上很多這樣的程式碼:

public class Singleton {
    private static Singleton instance;
    private Singleton (){}

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

這種寫法執行緒不安全,改進一下,加一個同步鎖:

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

網上這樣的程式碼更多,可以很好的工作,但是缺點是效率低。
實際上,早在JDK1.5就引入volatile關鍵字,所以又有了一種更好的雙重校驗鎖寫法:

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; } }

注意,別忘記volatile關鍵字哦,否則就是10重,100重也可能還是會出問題。
上面是用的最多的,還有一種靜態內部類寫法更推薦:

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

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