單例模式實現的幾種方式
阿新 • • 發佈:2019-02-18
餓漢式:
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.推薦第一種和第三種寫法,可根據需要進行選擇.