嘀荼酴 发表于 2025-6-26 13:54:29

【设计模式】单例模式

单例模式深度解析:从基础到实现原理

一、单例模式核心概念

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。这种模式的核心价值在于:

[*]✅ 避免资源冲突(如配置文件、数据库连接池)
[*]✅ 节省系统资源开销
[*]✅ 统一管理共享资源
[*]✅ 控制全局访问点
典型应用场景:

[*]配置管理器(全局共享配置)
[*]数据库连接池(避免重复创建连接)
[*]日志记录器(统一管理日志写入)
[*]设备驱动程序(如打印机控制)
[*]缓存系统(全局共享缓存数据)
二、单例模式实现方式大全

1. 饿汉式(线程安全)

public class EagerSingleton {
    private static final EagerSingleton INSTANCE = new EagerSingleton();
   
    private EagerSingleton() {
      // 防止反射攻击
      if (INSTANCE != null) {
            throw new IllegalStateException("Singleton already initialized");
      }
    }
   
    public static EagerSingleton getInstance() {
      return INSTANCE;
    }
}

[*]⚡ 优点:实现简单,线程安全
[*]⚠️ 缺点:类加载时即初始化,可能造成资源浪费
2. 懒汉式(非线程安全)

public class LazySingleton {
    private static LazySingleton instance;
   
    private LazySingleton() {}
   
    public static LazySingleton getInstance() {
      if (instance == null) {
            instance = new LazySingleton();
      }
      return instance;
    }
}

[*]⚡ 优点:延迟初始化
[*]⚠️ 缺点:多线程环境下不安全
3. 同步方法懒汉式(线程安全)

public class SynchronizedSingleton {
    private static SynchronizedSingleton instance;
   
    private SynchronizedSingleton() {}
   
    public static synchronized SynchronizedSingleton getInstance() {
      if (instance == null) {
            instance = new SynchronizedSingleton();
      }
      return instance;
    }
}

[*]⚡ 优点:线程安全
[*]⚠️ 缺点:每次获取实例都加锁,性能差
4. 双重检查锁(DCL)

public class DoubleCheckedLockingSingleton {
    private static volatile DoubleCheckedLockingSingleton instance;
   
    private DoubleCheckedLockingSingleton() {}
   
    public static DoubleCheckedLockingSingleton getInstance() {
      if (instance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (instance == null) {
                  instance = new DoubleCheckedLockingSingleton();
                }
            }
      }
      return instance;
    }
}

[*]⚡ 优点:线程安全且高性能
[*]⚠️ 注意:必须使用volatile防止指令重排序
5. 静态内部类(推荐)

public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {}
   
    private static class Holder {
      static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
    }
   
    public static StaticInnerClassSingleton getInstance() {
      return Holder.INSTANCE;
    }
   
    // 防止反序列化破坏单例
    protected Object readResolve() {
      return getInstance();
    }
}6. 枚举单例(最佳实践)

public enum EnumSingleton {
    INSTANCE;
   
    // 添加业务方法
    public void businessMethod() {
      System.out.println("Business logic executed");
    }
}三、静态内部类原理深度剖析

静态内部类实现之所以无需同步开销,关键在于利用了Java类加载机制的天然线程安全性:

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【设计模式】单例模式