这里直接推荐两种线程安全写法。
Double-Check
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton doubleCheckSingleton;
private DoubleCheckSingleton() {
}
public static DoubleCheckSingleton getDoubleCheckSingleton() {
if (doubleCheckSingleton == null) {
synchronized (DoubleCheckSingleton.class) {
if (doubleCheckSingleton == null) {
doubleCheckSingleton = new DoubleCheckSingleton();
}
}
}
return doubleCheckSingleton;
}
}
静态内部
可以满足lazy loading需求;类的静态属性只会在第一次加载类的时候初始化。
public class StaticInnerSingleton {
private StaticInnerSingleton() {
}
private static class SingletonHolder {
private static final StaticInnerSingleton INSTANCE = new StaticInnerSingleton();
}
public static StaticInnerSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}