在Java中如何实现线程安全的懒加载单例

静态内部类是实现%ignore_a_1%懒加载单例的推荐方式,利用JVM类加载机制保证实例唯一性和延迟初始化,代码简洁且高效。

在java中如何实现线程安全的懒加载单例

在Java中实现线程安全的懒加载单例,关键是在保证实例延迟创建的同时,防止多个线程并发创建多个实例。以下是几种常用且有效的实现方式。

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

这种方式既保证了懒加载,又提升了性能,因为只有在实例未创建时才进行同步。

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;    }}

说明:使用 volatile 关键字确保多线程环境下实例的可见性和禁止指令重排序,synchronized 块保证同一时刻只有一个线程能初始化实例。

使用静态内部类(推荐)

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

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

数控高级编程讲义 doc版 数控高级编程讲义 doc版

在数控加工中,行切和环切是典型的两种走刀路线。 行切在手工编程时多用于规则矩形平面、台阶面和矩形下陷加工,对非矩形区域的行切一般用自动编程实现。 环切主要用于轮廓的半精、精加工及粗加工,用于粗加工时,其效率比行切低,但可方便的用刀补功能实现。本书内容全面、实例丰富、全面系统,本平台提供数控高级编程讲义doc版下载,需要的朋友们可以下载看看吧!

数控高级编程讲义 doc版 0 查看详情 数控高级编程讲义 doc版

public class Singleton {    private Singleton() {}    private static class Holder {        static final Singleton INSTANCE = new Singleton();    }    public static Singleton getInstance() {        return Holder.INSTANCE;    }}

说明:JVM 保证类的静态内部类在首次访问时才加载,且只加载一次。这种方式简洁、高效、线程安全,且支持懒加载,是推荐做法。

使用枚举(最安全但非典型懒加载)

Effective Java 中推荐的方式,防止反射和序列化破坏单例。

public enum Singleton {    INSTANCE;    public void doSomething() {        // 业务方法    }}

说明:枚举实例在类加载时创建,不是严格意义上的懒加载(延迟到首次使用),但绝对线程安全,且防止反射攻击。

总结对比

双重检查锁定:支持懒加载,需正确使用 volatile,代码稍复杂。 静态内部类:推荐方式,天然线程安全,懒加载,代码简洁。 枚举:最安全,防反射,但实例在类加载时就创建,不完全懒加载。

如果追求简洁和安全,优先选择静态内部类方式。基本上就这些。

以上就是在Java中如何实现线程安全的懒加载单例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1036902.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 03:06:21
下一篇 2025年12月2日 03:06:42

相关推荐

发表回复

登录后才能评论
关注微信