java单例模式通过私有构造方法禁止外部new实例,结合饿汉式、懒汉式(双重检查锁)、静态内部类三种实现方式,分别满足线程安全、懒加载与简洁性需求。

Java 中通过私有构造方法实现单例模式,核心是:**禁止外部 new 实例,只允许类内部创建唯一对象,并提供全局访问点**。关键在于控制实例的创建时机和访问方式。
私有构造方法 + 静态实例字段(饿汉式)
在类加载时就创建好唯一实例,线程安全、简单直接,但可能浪费资源(如果实例从未被使用)。
- 用 private 修饰构造方法,阻止外部调用 new
- 声明一个 private static final 的本类类型字段,在类初始化时直接 new 出来
- 提供 public static 方法返回该实例(通常叫 getInstance())
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {} // 私有构造,外部无法 new
public static Singleton getInstance() {
return instance;
}
}
私有构造方法 + 懒汉式(双重检查锁)
延迟创建实例,节省内存;但必须加同步机制防止多线程下生成多个实例。推荐使用 volatile 防止指令重排序。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 静态实例字段初始为 null
- getInstance() 中先判断是否已创建,未创建则加 synchronized 块,块内再次判断(双重检查)
- 用 volatile 修饰实例字段,保证可见性和有序性
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;
}
}
私有构造方法 + 静态内部类(推荐)
兼顾懒加载、线程安全、写法简洁。利用 JVM 类加载机制保证仅加载一次且天然同步。
- 外部类不持有实例,只定义私有构造方法
- 新增一个 private static 内部类,里面声明并初始化 static 实例
- getInstance() 返回内部类的静态字段 —— 内部类首次被引用时才加载,从而实现懒加载
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
注意事项与常见误区
私有构造只是基础,真正决定单例是否可靠的是实例创建和访问逻辑。
- 反射可绕过私有构造,如需彻底防护,可在构造方法中加标志位校验(不常用,一般场景无需)
- 序列化会破坏单例,若类实现 Serializable,需定义 readResolve() 方法返回原实例
- 枚举方式(public enum Singleton { INSTANCE; })更简洁安全,但不基于“私有构造方法”这一题干要求,属于进阶替代方案
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










