一般我们写单例模式要达到懒加载+线程安全+高性能一般会使用双锁检测DCL写法,如下:
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
现在可以利用
①静态内部类是在被显式调用才被加载
②final可见且不可变=绝对线程安全
来达成懒加载+线程安全+高性能的要求,不过这种写法和DCL写法不同的是只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
写法如下:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}