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

在Java中实现线程安全的懒加载单例模式,关键在于既要保证实例延迟初始化(即“懒加载”),又要防止多线程环境下创建多个实例。下面介绍几种常见且有效的实现方式。
这是最常用的懒加载且线程安全的实现方式,通过volatile关键字和同步块结合来提升性能与安全性。
说明:只在第一次创建实例时加锁,后续调用直接返回已创建的实例,避免每次都进入同步代码块。
示例代码:
立即学习“Java免费学习笔记(深入)”;
<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>注意点:
利用类加载机制保证线程安全,同时实现真正的懒加载。
原理: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>优点:
Effective Java 推荐的方式,不仅能防止多线程问题,还能防止反射和序列化破坏单例。
示例代码:
立即学习“Java免费学习笔记(深入)”;
<font face="Courier New,Courier,monospace">public enum Singleton {
INSTANCE;
public void doSomething() {
// 业务方法
}
}</font>适用场景:
双重检查锁定:高效、懒加载明显,但需正确使用volatile。
静态内部类:推荐大多数场景,兼顾线程安全与懒加载,代码清晰。
枚举:最强安全性,适合对单例完整性要求极高的系统组件。
基本上就这些。选择哪种方式取决于你是否需要防御反射、是否追求极致延迟加载,以及代码可读性要求。静态内部类方式在多数项目中是最平衡的选择。
以上就是在Java中如何实现线程安全的懒加载单例_懒加载单例模式并发技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号