java并发编程—单例模式双重校验锁变量为什么使用 volatile 修饰?
在单例模式中,双重校验锁是一种常用的线程安全实现方式。在这种实现方式中,需要使用volatile关键字来修饰单例对象的变量,以保证线程安全。
原因是,双重校验锁中的第一次判空操作可能会出现指令重排的情况,导致多个线程同时进入第一个if语句块中,从而创建多个实例。使用volatile关键字可以禁止指令重排,保证单例对象的初始化在多线程环境下的安全性。
下面是使用volatile关键字修饰单例对象变量的示例代码:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
在上面的代码中,instance变量使用了volatile关键字修饰,保证了其在多线程环境下的可见性和禁止指令重排。同时,双重校验锁的实现方式也保证了线程安全和单例对象的唯一性。