单例双锁检测

2025/06/17

一、背景

这里复习一下单例。

二、类的构造函数私有化

例如

public class A {
    private A() {
    }
}

注意,A 类的构造函数虽然私有化了,但是从内部还是可以进行 new 的,外部不可以。

public class A {
    public static final A INSTANCE = new A(); // 可以从内部进行 new
    private A() {
    }
}

三、双锁检测 (double-checked locking)

public class SingletonDemo {

    // volatile 防止指令重排序,并且保证变更对于其他线程可见。
    private static volatile SingletonDemo instance;

    private SingletonDemo() {}

    public static SingletonDemo getInstance() {
        // 加锁前判断一次,防止不必要的加锁,缩小锁的范围
        if (instance == null) {
            synchronized (SingletonDemo.class) {
                // 预防其他线程也创建的实例,再次判断
                if (instance == null) {
                    instance = new SingletonDemo();
                }
            }
        }
        return instance;
    }
}