如何實現一個單例
1、構造器需要私有化
2、提供一個私有的靜態變量
3、暴露一個公共的獲取單例對象的接口
需要考慮的兩個問題
1、是否支持懶加載
2、是否線程安全
1、餓漢式
public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton();private EagerSingleton(){}public EagerSingleton getInstance(){return INSTANCE;}}
不支持懶加載
線程安全
2、懶漢式
public class LazySingleton {private static LazySingleton INSTANCE;private LazySingleton() {}public static LazySingleton getInstance() {if (INSTANCE == null) {INSTANCE = new LazySingleton();}return INSTANCE;}
}
支持懶加載
線程不安全
public class LazySingleton {private static LazySingleton INSTANCE;private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (INSTANCE == null) {INSTANCE = new LazySingleton();}return INSTANCE;}
}
支持懶加載
線程安全
3、雙重檢查鎖
public class DoubleCheckSingleton {private static DoubleCheckSingleton INSTANCE;private DoubleCheckSingleton() {}public DoubleCheckSingleton getInstance() {if (INSTANCE == null) {synchronized (DoubleCheckSingleton.class) {if (INSTANCE == null) {INSTANCE = new DoubleCheckSingleton();}}}return INSTANCE;}
}
支持懶加載
線程安全
4、靜態內部類
public class InnerSingleton {private InnerSingleton() {}public static InnerSingleton getInstance() {return Singleton.INSTANCE;}private static class Singleton {private static final InnerSingleton INSTANCE = new InnerSingleton();}
}
支持懶加載
線程安全
5、枚舉
public enum EnumSingleton {INSTANCE;
}
支持懶加載
線程安全