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

Posted 骇客与画家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一个双检查的懒汉单例模式,双检查的目的是什么?相关的知识,希望对你有一定的参考价值。

为什么要有两个 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


以上是关于写一个双检查的懒汉单例模式,双检查的目的是什么?的主要内容,如果未能解决你的问题,请参考以下文章

多线程单例模式之延迟加载(懒汉模式)

单例模式之懒汉模式,懒汉模式之高效模式,DLC双判断模式

DCL双检查锁机制实现的线程安全的单例模式

Java单例模式之总有你想不到的知识

实现线程安全的单例模式

双重检查锁定和单例模式