單例模式常用三種寫法
阿新 • • 發佈:2019-01-24
餓漢式(空間換時間)
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而言,外部類和靜態內部類是兩個平等的物件,外部類被載入時靜態內部類並不需要立即被載入,靜態內部類不被載入則不需要進行類初始化,因此單例物件在外部類被載入了以後也不佔用記憶體,起到了懶載入的效果。