
01、什么是双重检查?
双重检查是一种用于单例模式的延迟初始化技术,它既保证了线程安全,又避免了每次获取实例时的同步开销.

02、两次判断的作用解析
if (instance == null) { // 第一次检查
synchronized (Singleton.class) {
// ...
}
}作用:避免不必要的同步等待
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查
instance = new Singleton();
}
}作用:防止重复创建实例
03、volatile的关键作用
private static volatile Singleton instance;volatile在这里解决了指令重排序问题,这是很多开发者容易忽略的关键点。
我们以为的instance = new Singleton()是原子操作,但实际上它包含三个步骤:
危险场景:
// 如果没有volatile,可能发生指令重排序:
// 步骤1:分配内存
// 步骤3:引用指向内存(此时instance != null,但对象未初始化)
// 步骤2:初始化对象
// 线程A执行到步骤3时,线程B看到instance不为null
// 直接返回未完全初始化的对象,导致程序错误04、小结
双重检查是一个经典的优化方案,它: