双重锁定检查(DCL,Double Check Lock)---单例模式

public class Singleton {
    // volatile防止指令重排序
    private volatile static Singleton instance = null;

    public static Singleton getInstance() {
        // 多线程竞争情况下,其他线程检测到instance不为空
        if (null == instance) {
            synchronized (Singleton.class) {
                // 多线程竞争情况下,如果其他线程第一次检测到instance为空,加锁创建完对象后再判断一次。
                if (null == instance) {
                    // 线程一被指令重排,先执行了赋值,但还没执行完构造函数(即未完成初始化)
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

 

posted @ 2020-06-09 09:41  蛋挞小子  阅读(436)  评论(0编辑  收藏  举报