前言: 之前看到介绍单例模式的一种线程安全的模式,后面看并发书籍时发现这个线程安全的模式如果修改一下则会有一些隐患,故记录下来。
参考书籍:《Java并发编程的艺术》
先看下这个单例吧
双重校验锁先判断 uniqueInstance 是否已经被初始化了,如果没有被实例化,那么才对实例化语句进行加锁。
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