双重检查锁单例模式
- DCL单例是线程安全、懒加载、高效的单例实现方法
- 第一个检测大大提高了效率,只有在对象没有初始化成功的那段时间,才会有线程通过第一个检测,而第二个检测保证instance只会被初始化一次。
- 如果没有volatile修饰单例对象,可能会发生指令重排,导致错误。实例化对象,分为3步,分配空间->初始化对象->将对象指向分配的空间,如果第二步和第三步被重排,会出现异常。
public class Singleton {
/** 单例对象 */
private static volatile Singleton instance;
/** 构造方法私有 */
private Singleton() {}
public static Singleton getInstance() {
// 提高效率
if (instance == null) {
// 保证单例
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}