news 2026/4/23 14:09:36

Java 单例模式的五种实现:饿汉式、懒汉式、DCL、静态内部类、枚举单例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 单例模式的五种实现:饿汉式、懒汉式、DCL、静态内部类、枚举单例

Java 单例模式的五种实现:饿汉式、懒汉式、DCL、静态内部类、枚举单例

在 Java 面试中,单例模式几乎是必问内容。虽然看似简单,但不同实现方式的线程安全、性能以及是否能抵御反射与序列化攻击,都存在巨大的差异。
这次,卷卷就来将单例模式常见的五种实现方式进行整理和对比,适合用于学习、复习以及面试答题。


一、饿汉式(最简单但可能浪费资源)

实现思想:

类加载时就创建单例对象,无需加锁,线程安全。

优点:

  • 实现简单
  • JVM 类加载机制保证线程安全
  • 无需额外锁开销,运行效率高

缺点:

  • 实例在类加载时就创建 → 如果初始化很重或实际没被使用,会浪费资源

适用场景:

实例非常轻量,或者确定一定会使用的单例场景。


二、懒汉式(节约资源但线程不安全)

实现思想:

实例在第一次访问时创建。

优点:

  • 延迟加载,节省资源

缺点:

  • 线程不安全,多线程下可能会创建多个实例
  • 需要额外同步措施才能安全使用

改进方式:

通过 synchronized 或 DCL 实现线程安全版本。


三、双重检查锁(DCL,Double-Check Locking)

要解决的问题:

懒汉式直接加锁效率太低,每次获取实例都要锁一次。

优化点:

  • 第一次判断实例是否为空:提高性能
  • 第二次在锁内判断:保证线程安全
  • 仅首次创建实例时加锁,后续访问无需锁

关键点:

实例引用必须加上volatile,否则可能出现指令重排导致拿到未初始化完成的对象。

优点:

  • 线程安全
  • 性能很好(只第一次加锁)
  • 仍然支持懒加载

四、静态内部类(推荐写法)

实现思想:

利用类加载机制实现懒加载与线程安全。

内部类不会随外部类加载,只有调用getInstance()时才加载内部类并创建实例。

优点:

  • 写法最简单
  • 天然线程安全
  • 可实现懒加载
  • 不用加锁,性能最好

示例:

publicclassSingleton{privateSingleton(){}privatestaticclassHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}

五、枚举单例(Java 官方推荐,终极方案)

特点:

利用枚举类型实现单例,是 Java 中唯一完全防御:

  • 反射攻击
  • 反序列化攻击

的单例写法。

优点:

  • JVM 枚举底层保证实例唯一
  • 防止反射创建新对象
  • 防止反序列化生成新对象
  • 实现最简洁

示例:

publicenumSingleton{INSTANCE;}

六、五种单例方式对比总结(面试高频)

实现方式是否懒加载是否线程安全是否安全抵御反射/序列化性能
饿汉式
懒汉式(未加锁)
懒汉式 synchronized
DCL是(需 volatile)
静态内部类很高(推荐)
枚举单例是(唯一)很高

七、面试官喜欢听的总结

如果在面试中被问到“你更推荐哪种单例模式?”
可以这样回答:

我更推荐使用静态内部类方式,因为它结合了懒加载、线程安全以及高性能的所有优点,写法简洁且稳定。
如果对安全性要求极高(防止反射、反序列化),那枚举单例是最稳妥的选择。


八、卷式总结

饿汉式太着急,懒汉式太磨叽,DCL 看着帅但少个 volatile 就寄;
静态内部类不声不响地最稳,枚举更离谱:
反射打不过它,序列化打不过它,我也打不过它。

总之就是一句话:
单例不难,难的是理解单例为什么不难。

今天的脑细胞库存-1,知识储备+1,算是赚了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 13:53:21

军工单位案例:LobeChat在涉密网络中的应用

军工单位案例:LobeChat在涉密网络中的应用 在现代军事信息化建设的推进过程中,智能化辅助决策系统的需求日益迫切。指挥员需要快速获取情报分析、作战推演和战备方案建议,而传统人工处理方式效率低、响应慢。与此同时,大语言模型…

作者头像 李华
网站建设 2026/4/23 13:55:10

LobeChat复购激励方案设计

LobeChat复购激励方案设计 在企业级 AI 应用快速落地的今天,一个看似简单的“聊天界面”早已不再是功能堆砌的前端展示层。如何让用户不仅愿意用、还能持续用,成了决定产品能否商业化的关键一环。尤其是当大模型能力逐渐趋同,用户体验和用户粘…

作者头像 李华
网站建设 2026/4/23 12:29:22

LobeChat与Notion集成:自动记录会议纪要

LobeChat与Notion集成:自动记录会议纪要 在远程办公成为常态的今天,团队每天可能参与多场线上会议——项目同步、需求评审、客户沟通……会后却总面临同一个难题:谁来整理纪要?手动记录不仅耗时费力,还容易遗漏关键信息…

作者头像 李华
网站建设 2026/4/23 13:52:41

国家自然科学基金项目题目选择技巧

国家自然科学基金的项目题目是评审专家看到的第一印象,是全文的“文眼”。一个好题目能瞬间抓住眼球,清晰传达核心科学问题。其核心技巧在于:用最精炼的语言,准确、清晰地概括研究的“灵魂”。一个好的题目通常包含三个核心要素&a…

作者头像 李华
网站建设 2026/4/23 11:53:34

Typora代码块痛点破解方案:从高亮失效到跨平台兼容的终极指南

Typora 代码块痛点破解方案:从高亮失效到跨平台兼容的终极指南 引言:为什么我们离不开 Typora 代码块? 作为 Markdown 编辑器中的「瑞士军刀」,Typora 以其「所见即所得」的实时渲染特性,成为程序员、科研人员、技术…

作者头像 李华
网站建设 2026/4/23 12:34:07

代码重构艺术:从烂代码到优雅架构的蜕变(附设计模式实战案例)

引言:为什么重构是程序员的必修课?每一位程序员都曾与「烂代码」缠斗过:几百行的巨型函数、牵一发而动全身的耦合逻辑、毫无注释的「天书」代码、新增一个功能就要改遍整个文件…… 烂代码就像技术债务,初期看似节省时间&#xff…

作者头像 李华