题目
介绍下单例模式及其实现方式
答案
@[toc] ## 什么是单例模式 单例模式(Singleton Pattern)确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 ## 单例模式的实现方式 ### 饿汉式(线程安全) ```java public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } } ``` **特点**:类加载时立即初始化,线程安全但可能浪费内存。 ### 懒汉式(线程不安全) ```java public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } } ``` **特点**:延迟加载,但多线程环境下可能创建多个实例。 ### 同步懒汉式(线程安全) ```java public class SyncLazySingleton { private static SyncLazySingleton instance; private SyncLazySingleton() {} public static synchronized SyncLazySingleton getInstance() { if (instance == null) { instance = new SyncLazySingleton(); } return instance; } } ``` **特点**:通过`synchronized`保证线程安全,但性能较差。 ### 双重检查锁(DCL,线程安全) ```java public 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`防止指令重排序。 ### 静态内部类(线程安全) ```java public class InnerClassSingleton { private InnerClassSingleton() {} private static class Holder { private static final InnerClassSingleton instance = new InnerClassSingleton(); } public static InnerClassSingleton getInstance() { return Holder.instance; } } ``` **特点**:利用类加载机制保证线程安全,延迟加载且无锁。 ### 枚举(线程安全,防反射/序列化攻击) ```java public enum EnumSingleton { INSTANCE; public void doSomething() { // 业务方法 } } ``` **特点**:JVM 保证单例,天然防反射、序列化破坏,推荐使用。 ### 对比总结 | 实现方式 | 线程安全 | 延迟加载 | 防反射 | 防序列化 | 性能 | | :--------- | :------- | :------- | :----- | :------- | :--- | | 饿汉式 | ✔️ | ❌ | ❌ | ❌ | 高 | | 懒汉式 | ❌ | ✔️ | ❌ | ❌ | 高 | | 同步懒汉式 | ✔️ | ✔️ | ❌ | ❌ | 低 | | 双重检查锁 | ✔️ | ✔️ | ❌ | ❌ | 中 | | 静态内部类 | ✔️ | ✔️ | ❌ | ❌ | 高 | | 枚举 | ✔️ | ❌ | ✔️ | ✔️ | 高 | ### 最佳实践 - 需要延迟加载 → **静态内部类** - 需要防反射/序列化 → **枚举** - 旧版本兼容场景 → **双重检查锁**