单例模式有哪几种实现?如何保证线程安全?
2026/9/23 9:58:22 网站建设 项目流程

单例模式实现 & 线程安全(面试markdown版)

单例:保证一个类在整个应用中只有一个实例对象,提供全局访问点。

1. 饿汉式(静态常量)

publicclassSingleton{// 类加载直接初始化实例privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}
  • 线程安全:✅ 类加载阶段就创建实例,JVM类加载机制保证线程安全
  • 缺点:类加载就创建对象,不管用不用,会占用内存;不支持懒加载

2. 懒汉式(非线程安全,不推荐)

publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}
  • 线程安全:❌ 多线程并发,会创建多个实例
  • 优点:懒加载,用到才创建
  • 缺点:并发场景直接报废

3. 懒汉式 + synchronized 方法(加锁,性能差)

publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}
  • 线程安全:✅
  • 缺点:每次调用getInstance都要获取锁,高并发性能很低

4. 双重检查锁 DCL(Double‑Checked Lock,生产常用)

publicclassSingleton{// 必须加volatile,防止指令重排privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){// 第一次判断:不为空直接返回,减少锁竞争if(instance==null){synchronized(Singleton.class){// 第二次判断:防止多个线程等待锁后重复创建if(instance==null){instance=newSingleton();}}}returninstance;}}
  • 线程安全:✅
  • volatile作用:禁止new Singleton()指令重排。

new对象分三步:分配内存→初始化对象→赋值引用;不加volatile可能先赋值再初始化,其他线程拿到半初始化对象。

  • 优点:懒加载、并发性能好

5. 静态内部类(推荐,最优)

publicclassSingleton{privateSingleton(){}// 静态内部类,只有调用getInstance才会加载privatestaticclassSingletonHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnSingletonHolder.INSTANCE;}}
  • 线程安全:✅ JVM类加载保证,没有锁开销
  • 原理:外部类加载不会加载内部类;只有访问SingletonHolder才初始化实例
  • 优点:懒加载、无线锁、实现简洁

6. 枚举单例(Effective Java推荐,防反射、防序列化破坏)

publicenumSingletonEnum{INSTANCE;//业务方法publicvoiddoSomething(){}}
  • 线程安全:✅
  • 优势:天然防止反射、序列化破坏单例;写法最简单
  • 缺点:饿汉,类加载就实例化,不支持懒加载

如何保证单例线程安全总结

  1. 饿汉式 / 静态内部类 / 枚举:依靠JVM类加载机制保证线程安全,不需要手动加锁。
  2. 懒汉同步方法:依靠synchronized方法锁,性能差。
  3. DCL双重检查锁synchronized+volatile,既要锁,又要禁止指令重排。

注意点:

  • 反射可以暴力调用私有构造器破坏单例;枚举天然规避这个问题。
  • 序列化/反序列化也会破坏普通单例,枚举同样天然解决。

总结

  • 追求简单安全:枚举
  • 想要懒加载、高性能:静态内部类
  • 需要手动控制实例创建时机:DCL双重检查锁

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询