1. 选择饿汉式单例模式
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
- 适用场景及原因:适用于对启动性能要求较高且获取频率较低的模块。因为类加载机制保证了实例的唯一性,且在类加载时就创建实例,无需额外的同步操作,所以启动速度快。在高并发环境下,饿汉式单例模式天然支持多线程安全,无需担心同步问题。
2. 选择双重检查锁定(DCL)单例模式
public class DoubleCheckedLockingSingleton {
private volatile static DoubleCheckedLockingSingleton instance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedLockingSingleton();
}
}
}
return instance;
}
}
- 适用场景及原因:适用于频繁获取单例对象的模块。
volatile
关键字确保了实例在多线程环境下的可见性和禁止指令重排序,避免了在高并发场景下可能出现的空指针异常。双重检查机制减少了不必要的同步开销,在第一次检查instance == null
时,如果实例已存在,就无需进入同步块,提高了获取单例的效率。