单例模式-懒汉式,是单例模式的一种经典方式。涉及到双重检测锁DCL,volatile等。
采用双锁机制,安全且在多线程情况下能保持高性能。
进行了两次的判断,第一次是为了避免不要的实例,第二次是为了进行同步,避免多线程问题。
由于instance = new SingletonDemo3();对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险,使用volatile修饰instance实例变量有效,解决该问题。
实现比较困难,一般不推荐使用。
DCL(Double Check Lock)
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
//第一次检测
if (uniqueInstance == null) {
synchronized (Singleton.class) {
//第二次检测
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
显而易见我们都知道volatile关键字的作用其实就是让该变量的变化对于每一个线程可见,其底层实现原理是由于java内存模型(jmm)中的封装了8个交互操作。
read:把一个主内存中的值传递到工作内存,以便load动作使用
load:把read操作从主内存获取