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;
}
}
生成对象实例的时候,分三步:分配空间、对象初始化、对象指向内存地址。 JVM 具有指令重排的特性可能会把执行顺序变为1->3->2.多线程下可能会搞事情,线程可能会获得一个没有初始化的实例。使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。