java单例模式必须用私有构造器,否则外部可随意new对象破坏唯一性;懒汉式用volatile+双重检查锁实现线程安全延迟加载;饿汉式在类加载时初始化,简单高效但不延迟;枚举单例最安全简洁,天然防反射和反序列化。

Java单例模式的核心,是确保一个类在JVM中只有一个实例,并提供全局访问点。实现的关键一步,就是用私有构造器阻止外部直接 new 实例。
为什么必须用私有构造器?
如果构造器是 public 或 protected,任何代码都能调用 new 创建新对象,单例就失去了意义。私有构造器(private ClassName() {})让类自身以外的代码无法实例化,把对象创建权牢牢控制在类内部。
懒汉式:延迟加载 + 双重检查锁(推荐用于多线程)
在第一次调用 getInstance() 时才创建实例,节省资源;加 volatile 防止指令重排,双重检查保证线程安全:
- 声明私有静态变量,用 volatile 修饰
- 构造器设为 private
- getInstance() 中先判断 instance 是否为 null,再加 synchronized 块,块内再次判断
示例片段:
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;
}
饿汉式:类加载时就初始化(简单、线程安全,但不支持延迟)
利用类加载机制的天然线程安全性,直接在静态字段声明时创建实例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 静态变量在类加载阶段完成初始化,JVM 保证其线程安全
- 无需同步,性能高
- 缺点:即使从不使用该实例,也会占用内存
示例:
private static final Singleton instance = new Singleton();private Singleton() {} // 同样必须私有
public static Singleton getInstance() {
return instance;
}
枚举单例:最简洁、最安全的方式(JDK5+)
利用枚举天生不可反射实例化、序列化安全、线程安全等特性,一行代码解决所有隐患:
- 没有显式构造器,也无法被反射破坏(Enum 构造器受 JVM 保护)
- 自动防止反序列化生成新实例
- 写法极简,且能天然防止多次加载(如 ClassLoader 场景)
示例:
public enum Singleton {INSTANCE;
// 可添加方法
public void doSomething() { ... }
}
获取方式:Singleton.INSTANCE.doSomething()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










