双重检查锁(Double check lock)单例

931 阅读1分钟

双重检查锁单例模式

  1. DCL单例是线程安全、懒加载、高效的单例实现方法
  2. 第一个检测大大提高了效率,只有在对象没有初始化成功的那段时间,才会有线程通过第一个检测,而第二个检测保证instance只会被初始化一次。
  3. 如果没有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;
    }
}