1. 程式人生 > >單例模式實現的幾種方式

單例模式實現的幾種方式

餓漢式:

public class Singleton {

    private static Singleton sInstance = new Singleton();

    private Singleton() {};

    public static Singleton getSinstance() {
        return sInstance;
    }

}

餓漢式在類建立的時候就已經建立一個靜態的物件,不論是否使用,它都一直存在,都會佔用記憶體,相應的第一次呼叫時速度也快.而且,天生執行緒安全.
懶漢式:

public class Singleton {

    private
static Singleton sInstance = null; private Singleton() {}; public synchronized static Singleton getsInstance() { if (sInstance == null) sInstance = new Singleton(); return sInstance; } }

對比可以看到懶漢式只用在第一次呼叫時才會去建立物件,考慮到可能同時有多個地方去初始化物件,所以執行緒不安全,需要加synchronized關鍵字.第一次呼叫時會比餓漢式慢.
而且,每次呼叫getsInstance()都要去進行synchronized同步,效能上會差很多.所以就有了優化版的懶漢式寫法,也叫做雙重檢查寫法:

public class Singleton {

    private static Singleton sInstance = null;

    private Singleton() {};

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

這樣的話只有在第一次初始化時進行synchronized同步,以後每次呼叫都只判斷是否為null.推薦第一種和第三種寫法,可根據需要進行選擇.