告别等待,迎接“即食”互联网:蘑菇3秒,不止是快!
序号实现方式线程安全懒加载性能防止反射破坏防止序列化破坏代码复杂度适用场景1饿汉式是否高❌❌低单线程环境简单应用2懒汉式(线程不安全)否是高❌❌低单线程环境性能要求高3懒汉式(方法同步)是是低❌❌中多线程但性能要求不高4双重检查锁(DCL)是是高❌❌中多线程性能要求高5静态内部类是是高❌❌中推荐使用兼顾性能和懒加载6枚举是否高✅✅低最佳实践保证绝对单例7ThreadLocal单例线程内安全是中❌❌高线程池环境线程隔离单例详细说明
饿汉式public class EagerSingleton { private static final EagerSingleton instance new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }优点: 实现简单线程安全缺点: 类加载时就初始化浪费内存
懒汉式(线程不安全)public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance null) { instance new LazySingleton(); } return instance; } }优点: 懒加载需要时才创建缺点: 线程不安全可能创建多个实例
懒汉式(方法同步)public class SyncSingleton { private static SyncSingleton instance; private SyncSingleton() {} public static synchronized SyncSingleton getInstance() { if (instance null) { instance new SyncSingleton(); } return instance; } }优点: 线程安全懒加载缺点: 每次获取都加锁性能差
双重检查锁(DCL)public class DCLSingleton { private volatile static DCLSingleton instance; private DCLSingleton() {} public static DCLSingleton getInstance() { if (instance null) { synchronized (DCLSingleton.class) { if (instance null) { instance new DCLSingleton(); } } } return instance; } }优点: 线程安全懒加载性能较好缺点: JDK
5才完全安全实现稍复杂
静态内部类public class InnerClassSingleton { private InnerClassSingleton() {} private static class SingletonHolder { private static final InnerClassSingleton instance new InnerClassSingleton(); } public static InnerClassSingleton getInstance() { return SingletonHolder.instance; } }优点: 线程安全懒加载性能好缺点: 无法防止反射破坏
枚举(最佳实践)public enum EnumSingleton { INSTANCE; public void doSomething() { // 业务方法 } }优点:绝对防止反射破坏自动处理序列化线程安全代码简洁缺点: 不是懒加载枚举类加载时就初始化
ThreadLocal单例public class ThreadLocalSingleton { private static final ThreadLocalThreadLocalSingleton threadLocal ThreadLocal.withInitial(ThreadLocalSingleton::new); private ThreadLocalSingleton() {} public static ThreadLocalSingleton getInstance() { return threadLocal.get(); } }优点: 线程内单例适合线程池环境缺点: 每个线程有自己的实例不是真正的全局单例选择建议简单场景饿汉式标准需求静态内部类推荐严格要求枚举最佳实践线程隔离ThreadLocal单例历史遗留DCL注意volatile关键字
注意事项反射攻击防护只有枚举能天然防止反射破坏其他方式需要额外防护代码序列化问题实现Serializable接口时需要添加readResolve()方法克隆防护重写clone()方法抛出CloneNotSupportedException多类加载器自定义类加载器可能破坏单例需注意类加载器隔离
188330·mooc新疆-188330·mooc新疆应用