首页 > Java > java教程 > 正文

在Java中如何实现线程安全的懒加载单例_懒加载单例模式并发技巧

P粉602998670
发布: 2025-11-20 14:11:02
原创
812人浏览过
静态内部类方式是Java中实现线程安全懒加载单例的最佳选择,利用JVM类加载机制保证线程安全且实现延迟初始化;双重检查锁定需正确使用volatile关键字防止指令重排序,适用于追求极致性能的场景;枚举实现能防御反射和序列化攻击,适合对安全性要求极高的组件。

在java中如何实现线程安全的懒加载单例_懒加载单例模式并发技巧

在Java中实现线程安全的懒加载单例模式,关键在于既要保证实例延迟初始化(即“懒加载”),又要防止多线程环境下创建多个实例。下面介绍几种常见且有效的实现方式。

使用双重检查锁定(Double-Checked Locking)

这是最常用的懒加载且线程安全的实现方式,通过volatile关键字和同步块结合来提升性能与安全性。

说明:只在第一次创建实例时加锁,后续调用直接返回已创建的实例,避免每次都进入同步代码块。

示例代码:

立即学习Java免费学习笔记(深入)”;

Veed Video Background Remover
Veed Video Background Remover

Veed推出的视频背景移除工具

Veed Video Background Remover 69
查看详情 Veed Video Background Remover
<font face="Courier New,Courier,monospace">public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}</font>
登录后复制

注意点:

  • volatile确保实例化过程的可见性和禁止指令重排序。
  • 两次null检查分别用于减少不必要的同步和防止重复创建。

静态内部类实现(推荐)

利用类加载机制保证线程安全,同时实现真正的懒加载。

原理:JVM保证类的初始化是线程安全的,而内部类只有在被调用时才会加载。

示例代码:

立即学习Java免费学习笔记(深入)”;

<font face="Courier New,Courier,monospace">public class Singleton {
    private Singleton() {}

    private static class Holder {
        static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}</font>
登录后复制

优点:

  • 天然线程安全,无需手动加锁。
  • 延迟加载:直到getInstance()被调用才加载内部类并创建实例。
  • 代码简洁,无额外开销。

枚举实现(防反射攻击)

Effective Java 推荐的方式,不仅能防止多线程问题,还能防止反射和序列化破坏单例。

示例代码:

立即学习Java免费学习笔记(深入)”;

<font face="Courier New,Courier,monospace">public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 业务方法
    }
}</font>
登录后复制

适用场景:

  • 需要绝对防止多个实例出现(如反序列化或反射构造)。
  • 不追求懒加载极致延迟(枚举实例在类加载时初始化)。

对比总结

双重检查锁定:高效、懒加载明显,但需正确使用volatile

静态内部类:推荐大多数场景,兼顾线程安全与懒加载,代码清晰。

枚举:最强安全性,适合对单例完整性要求极高的系统组件。

基本上就这些。选择哪种方式取决于你是否需要防御反射、是否追求极致延迟加载,以及代码可读性要求。静态内部类方式在多数项目中是最平衡的选择。

以上就是在Java中如何实现线程安全的懒加载单例_懒加载单例模式并发技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号