当前位置: 首页
AI教程
Java单例模式七种实现方式及线程安全对比解析

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

热心网友 时间:2026-07-03
转载

谈及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

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
批处理BAT入门教程第一篇

批处理BAT入门教程第一篇

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

时间:2026-07-03 16:15
从零开始批处理命令For循环详解与实战案例

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

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

时间:2026-07-03 16:14
批评你的人是你生命中的贵人

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

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

时间:2026-07-03 16:14
测试人员角色定位与职责详解

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

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

时间:2026-07-03 16:14
经营成功测试生涯的实用方法与策略

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

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

时间:2026-07-03 16:14
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜