一、背景
这里复习一下单例。
二、类的构造函数私有化
例如
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;
}
}