游乐游手机版
首页/AI教程/文章详情

Java单例模式七种实现方式及线程安全对比解析

时间:2026-07-03 15:58
枚举单例由Java虚拟机保证线程安全与唯一性,能防止反射和序列化破坏,但无法延迟加载。饿汉式线程安全、调用效率高;懒汉式可延迟加载但性能低;静态内部类兼顾延迟与线程安全;双重检测锁存在潜在bug。需根据资源占用和延迟需求选择。

谈及Java单例模式,开发者通常都不会陌生。饿汉式、懒汉式、双重检测锁、静态内部类以及枚举——实现方式可谓丰富多样。今天,我们将重点聚焦枚举方式,这一方案在《Effective Java》中被强烈推荐,确实具备独特的优势。

ja va单例模式

一、案例演示

先提供一个最直观的用法示例,三步即可完成,清晰易懂。

1、定义接口类

public interface MySingleton {
    void doSomething();
}

2、创建枚举类并实现接口

public enum Singleton implements MySingleton {
    INSTANCE {
        @Override
        public void doSomething() {
            System.out.println("执行方法。。。");
        }
    }
}

3、运行测试

public class Test {
    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }
}

这便是枚举实现单例最基础的形式。简洁明了,无需繁琐的锁机制或条件判断。

二、深入扩展

仅仅掌握用法还不够,我们需要理解其优势,以及与其他实现方式的对比。

1、枚举方式实现单例的优势

枚举单例最大的亮点在于:天然线程安全,且能彻底防止反射和序列化破坏。无需手动编写synchronized代码,也不必担心反序列化时产生新实例。Java虚拟机从底层保证了枚举实例的唯一性,比依赖代码防御的方式更为可靠。

2、五种实现方式的对比

  • 饿汉式:类加载时即创建实例,线程安全,调用效率高,但无法实现延迟加载。若单例对象较重且未被使用,会造成内存浪费。
  • 懒汉式:首次调用时才创建实例,支持延迟加载,但为保障线程安全需添加synchronized,调用效率较低。在高并发场景下性能表现不佳。
  • 静态内部类方式:同样支持延迟加载,利用类加载机制确保线程安全,资源利用率高,是一种较为优雅的方案。
  • 双重检测锁方式:看似完善,但由于JVM底层指令重排等问题,偶尔会出现BUG,实际开发中不建议采用。
  • 枚举式(推荐):线程安全,调用效率高,但无法延迟加载。好在大多数场景下单例对象并不庞大,延迟加载的需求并不迫切。

3、总结

1. 饿汉式线程安全,调用效率高,但不能延迟加载。
2. 懒汉式线程安全,调用效率不高,能延迟加载。
3. 双重检测锁式由于JVM底层内部模型原因,偶尔会出问题。不建议使用。
4. 静态内部类式线程安全,资源利用率高,可以延时加载。
5. 枚举单例线程安全,调用效率高,但不能延迟加载。

4、如何选择?

没有银弹,需根据实际场景决定:

  • 若单例对象占用资源少,无需延时加载:枚举式 优于 饿汉式。枚举的防破坏能力更强。
  • 若单例对象占用资源大,需要延时加载:静态内部类式 优于 懒汉式。静态内部类兼顾了延迟加载与性能。

以上是对枚举单例的梳理总结。在实际项目中,根据资源需求与代码风格选择合适的实现方式即可。

来源:https://developer.aliyun.com/article/704950
上一篇GEO与SEO核心差异:面向AI搜索的下一代优化体系 下一篇AI遇见Kubernetes对话式可观测性让运维效率翻倍
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
批处理BAT入门教程第一篇
AI教程 · 2026-07-03

批处理BAT入门教程第一篇

提供13个批处理实战技巧,覆盖全盘查找并删除文件夹或文件、拷贝移动文件、创建畸形文件夹及设置隐藏属性等场景,可一键完成系统维护与文件管理工作,极大提升自动化操作效率和便捷性。

从零开始批处理命令For循环详解与实战案例
AI教程 · 2026-07-03

从零开始批处理命令For循环详解与实战案例

批处理For命令支持 d、 l、 r、 f四个参数。 d仅列出当前目录下的目录名; r递归搜索指定路径及其子目录中的文件; l生成数值序列; f可解析文件、字符串或命令输出,通过delims、tokens、skip、eol等选项灵活处理内容。

批评你的人是你生命中的贵人
AI教程 · 2026-07-03

批评你的人是你生命中的贵人

批评你的人往往最值得珍惜,因为他们关注你、助你成长。面对批评应包容反思,用行动改进而非辩解。接受批评是自我完善的过程,能让人少走弯路,避免重复犯错。这样的人正是生命中的贵人,值得感恩与珍惜。

测试人员角色定位与职责详解
AI教程 · 2026-07-03

测试人员角色定位与职责详解

测试人员角色经历了从找问题、保证质量到分析风险的转变,最终核心职责是提供关键信息,协助团队创造优秀产品。这包括识别问题、评估风险及帮助团队了解项目状态,而非单纯把关或追求完美。

经营成功测试生涯的实用方法与策略
AI教程 · 2026-07-03

经营成功测试生涯的实用方法与策略

一、测试生涯的起点 1989年,我在田纳西大学攻读研究生时,意外地从软件开发人员转行成为一名软件测试工程师。这并非我主动选择,说起来还有些戏剧性——某个早晨,教授质问我为何缺席那么多开发会议,我解释说这些会议总是安排在周末早上,对我这个第一次离家、刚入学的学生来说实在不便。结果呢?等待我的不是解聘通