%ignore_a_1%单例模式在Java中通过延迟实例化并保证线程安全,常见实现有:1. 双重检查锁定,使用volatile和synchronized确保高效且安全;2. 静态内部类,利用JVM类加载机制实现懒加载与线程安全;3. 枚举方式,代码简洁且天然防反射和序列化破坏;4. synchronized方法,线程安全但性能低。推荐使用双重检查锁定、静态内部类或枚举方式。

在Java中,懒加载单例模式的核心是:类的实例在第一次被使用时才创建,同时保证多线程环境下只创建一个实例。实现线程安全的懒加载单例有多种方式,下面介绍几种常见且有效的实现方法。
1. 双重检查锁定(Double-Checked Locking)
这是最常用的线程安全懒加载实现方式,通过synchronized关键字和volatile修饰符配合使用,确保性能和安全性。
使用synchronized块减少锁的粒度,避免每次调用都加锁 用volatile防止指令重排序,确保实例初始化完成前不会被其他线程访问
代码示例:
Pic Copilot
AI时代的顶级电商设计师,轻松打造爆款产品图片
158 查看详情
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; }}
2. 静态内部类(Holder模式)
利用类加载机制保证线程安全,同时实现懒加载。JVM保证类的初始化是线程安全的,且内部类在外部类加载时不立即加载。
立即学习“Java免费学习笔记(深入)”;
没有显式同步,性能高 只有在调用getInstance时才会触发内部类加载和实例创建
代码示例:
public class Singleton { private Singleton() {} private static class Holder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; }}
3. 枚举方式(推荐)
Effective Java作者Joshua Bloch推荐使用枚举实现单例,天然防止反射攻击和序列化破坏,代码简洁。
自动支持序列化,无需额外处理 防止通过反射创建多个实例 实现简单,代码最少
代码示例:
public enum Singleton { INSTANCE; public void doSomething() { // 业务方法 }}
4. synchronized方法(简单但低效)
早期实现方式,对整个getInstance方法加锁,线程安全但性能较差,每次调用都会同步。
不推荐用于高频调用场景。
public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}
基本上就这些常见实现方式。双重检查锁定和静态内部类适合大多数场景,枚举方式最为安全简洁。选择哪种方式取决于是否需要序列化、是否担心反射攻击以及代码风格偏好。
以上就是Java里如何实现线程安全的懒加载单例_懒加载单例实现方法解析的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1048451.html
微信扫一扫
支付宝扫一扫