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

在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免费学习笔记(深入)”;
BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛
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,代码稍复杂。
- 静态内部类:推荐方式,天然线程安全,懒加载,代码简洁。
- 枚举:最安全,防反射,但实例在类加载时就创建,不完全懒加载。
如果追求简洁和安全,优先选择静态内部类方式。基本上就这些。









