1. 什么是单例模式单例模式Singleton Pattern是 Java 设计模式中最常用的一种它确保一个类只有一个实例并提供一个全局访问点。这种模式主要用于控制资源访问、配置管理、线程池、缓存等场景。2. 为什么需要单例模式节省资源避免频繁创建和销毁对象减少系统开销。全局访问提供一个统一的访问入口方便管理。数据一致性确保所有操作都基于同一个实例避免数据不一致。线程安全在多线程环境下确保实例的唯一性。3. 单例模式的实现方式3.1 饿汉式Eager Initializationpublic class EagerSingleton { // 类加载时就创建实例 private static final EagerSingleton instance new EagerSingleton(); // 私有构造方法防止外部实例化 private EagerSingleton() {} // 提供全局访问点 public static EagerSingleton getInstance() { return instance; } }优点实现简单线程安全。缺点类加载时就初始化可能造成资源浪费。3.2 懒汉式Lazy Initializationpublic class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (instance null) { instance new LazySingleton(); } return instance; } }优点延迟加载节省资源。缺点每次获取实例都要同步性能较差。3.3 双重检查锁Double-Checked Lockingpublic class DCLSingleton { private static volatile DCLSingleton instance; private DCLSingleton() {} public static DCLSingleton getInstance() { if (instance null) { synchronized (DCLSingleton.class) { if (instance null) { instance new DCLSingleton(); } } } return instance; } }优点线程安全延迟加载性能较好。缺点实现稍复杂需要 volatile 关键字防止指令重排序。3.4 静态内部类Static Inner Classpublic class InnerClassSingleton { private InnerClassSingleton() {} private static class SingletonHolder { private static final InnerClassSingleton INSTANCE new InnerClassSingleton(); } public static InnerClassSingleton getInstance() { return SingletonHolder.INSTANCE; } }优点线程安全延迟加载实现简洁。缺点无法传递参数。3.5 枚举Enumpublic enum EnumSingleton { INSTANCE; public void doSomething() { // 业务方法 } }优点线程安全防止反射攻击防止反序列化重新创建对象。缺点不够灵活无法继承。4. 单例模式的应用场景配置管理类读取配置文件全局共享配置信息。数据库连接池管理数据库连接避免频繁创建连接。日志记录器统一记录系统日志。线程池管理线程资源。缓存系统如 Redis 客户端连接。5. 单例模式的注意事项线程安全多线程环境下必须保证实例创建的唯一性。序列化与反序列化需要实现readResolve()方法防止反序列化创建新实例。反射攻击通过反射可以调用私有构造方法枚举方式可以防止这种攻击。类加载器不同的类加载器可能加载出多个单例实例。性能考虑根据实际需求选择合适的实现方式。6. 总结单例模式是 Java 开发中非常重要的设计模式掌握其各种实现方式及适用场景对于编写高质量代码至关重要。在实际开发中推荐使用静态内部类或枚举方式实现单例它们既能保证线程安全又具有较好的性能。