vlambda博客
学习文章列表

写一个双检查的懒汉单例模式,双检查的目的是什么?

为什么要有两个 if 判断?


答:第二个 if 判断用于拦截第一个获得对象锁线程以外的线程

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;
    }
}


关于 Java 单例模式中双重校验锁的实现目的及原理[1]


第二个 if 判断能拦截第一个获得对象锁线程以外的线程

public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}


这是懒汉模式下双重校验锁下的简单代码

public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {

                    uniqueInstance = new Singleton();

            }
        }
        return uniqueInstance;
    }
}


懒汉模式下非双重校验锁下的简单代码

差别在于第二个 if 判断能拦截第一个获得对象锁线程以外的线程。

笔者顺便做了张思维导图截图,模板可能选得不好,还是要多练练哈。


参考资料

[1]

关于Java单例模式中双重校验锁的实现目的及原理: https://www.cnblogs.com/ALego/p/11448563.html

[2]

https://www.cnblogs.com/ALego/p/11448563.html: https://www.cnblogs.com/ALego/p/11448563.html