
下是 单例模式 (Singleton Pattern) 的详细介绍,包括定义、优缺点、应用场景及代码实现:
以下是 5 种常见实现方式,针对不同场景选择:
public class LazySingleton {
private static LazySingleton instance;
// 私有构造方法,禁止外部直接实例化
private LazySingleton() {}
// 全局访问点(线程不安全)
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}public class EagerSingleton {
// 类加载时直接初始化实例(线程安全)
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}public class DoubleCheckedSingleton {
// volatile 防止指令重排序
private static volatile DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) { // 第一次检查,避免不必要的同步
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) { // 第二次检查,确保线程安全
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {}
// 静态内部类在首次调用 getInstance() 时加载
private static class SingletonHolder {
private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}public enum EnumSingleton {
INSTANCE; // 单例实例
// 添加业务方法
public void doSomething() {
System.out.println("Singleton is working");
}
// 使用示例:
public static void main(String[] args) {
EnumSingleton.INSTANCE.doSomething();
}
}实现方式 | 线程安全 | 延迟加载 | 防止反射攻击 | 代码复杂度 |
|---|---|---|---|---|
懒汉式 | ❌ | ✔️ | ❌ | 低 |
饿汉式 | ✔️ | ❌ | ❌ | 低 |
双重检查锁 | ✔️ | ✔️ | ❌ | 中 |
静态内部类 | ✔️ | ✔️ | ❌ | 低 |
枚举 | ✔️ | ❌ | ✔️ | 极低 |
readResolve() 方法。
单例模式是高频面试考点,理解其原理和实现细节对实际开发有重要意义。