双重校验锁实现对象单例
2022年3月8日小于 1 分钟Java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getUniqueInstance() {
if (instance == null) {
// 类对象加锁
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
注意: instanc 是用 volatile 关键字修饰的,volatile 可以禁止 JVM 的指令重排序,保证在多线程环境下也能正常运行
instance = new Singleton();
这段代码其实是分三步执行的
- 为 instance 分配内存空间
- 初始化 instance
- 将 instance 指向分配的内存地址
由于 JVM 有指令重排序的功能,所以代码执行顺序可能会变成 1-> 3-> 2(3完成后,instance 就不为空了,这时如果有其他线程进入,则会返回一个未初始化的 instance)