写一个双检查的懒汉单例模式,双检查的目的是什么?
为什么要有两个 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 判断能拦截第一个获得对象锁线程以外的线程。
笔者顺便做了张思维导图截图,模板可能选得不好,还是要多练练哈。
参考资料
关于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