java单例模式确保类有且仅有一个实例并提供全局访问点,常用方式包括:1.饿汉式(类加载时创建,线程安全但不延迟);2.双重检查锁(需volatile,延迟且高效);3.静态内部类(推荐,延迟加载且天然线程安全);4.枚举(最安全简洁,但不支持延迟)。

Java 中实现单例模式,核心是确保类在 JVM 中**有且仅有一个实例**,并提供全局访问点。关键在于控制构造方法、实例创建时机和线程安全性。下面介绍几种常用且实用的方式。
饿汉式(线程安全,简单直接)
类加载时就创建实例,天然线程安全,适合实例初始化开销小、必定会用到的场景。
// 推荐写法:静态常量 + private 构造
public class ConfigManager {
private static final ConfigManager instance = new ConfigManager();
private ConfigManager() {} // 私有构造,禁止外部 new
public static ConfigManager getInstance() {
return instance;
}
}
✅ 优点:无同步开销,绝对线程安全
❌ 缺点:类加载即初始化,可能浪费资源(如果实例从未被使用)
懒汉式(双重检查锁 DCL,延迟加载 + 高效线程安全)
第一次调用 getInstance() 时才创建实例,兼顾延迟加载和性能,需注意 volatile 关键字防止指令重排。
// 必须加 volatile!否则多线程下可能返回未完全构造的对象
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class DatabaseConnection {
private static volatile DatabaseConnection instance;
private DatabaseConnection() {}
public static DatabaseConnection getInstance() {
if (instance == null) {
synchronized (DatabaseConnection.class) {
if (instance == null) {
instance = new DatabaseConnection();
}
}
}
return instance;
}
}
✅ 优点:按需创建,线程安全,性能好(仅首次加锁)
❌ 注意:漏掉 volatile 会导致严重并发问题
静态内部类(推荐:延迟加载 + 天然线程安全)
利用 Java 类加载机制——外部类加载时不加载内部类,首次调用 getInstance() 才触发内部类加载和静态字段初始化,JVM 保证该过程线程安全。
public class Logger {
private Logger() {}
private static class LoggerHolder {
private static final Logger INSTANCE = new Logger();
}
public static Logger getInstance() {
return LoggerHolder.INSTANCE;
}
}
✅ 最佳实践之一:延迟加载、无同步、无 volatile、简洁安全
✅ 适用于绝大多数场景
枚举方式(最简 & 强防反射/反序列化)
由 JVM 保证单例,天然防止反射攻击和反序列化破坏,代码极简,但不支持延迟加载(类似饿汉式)。
public enum AppConfig {
INSTANCE;
private String configPath = "app.properties";
public String getConfigPath() {
return configPath;
}
}
// 使用:AppConfig.INSTANCE.getConfigPath();
✅ 极致安全,一行定义单例
✅ 自动防止反射、克隆、反序列化问题
❌ 不支持延迟初始化;语义上略偏离“类”的常规用法
实际开发中,优先选静态内部类或枚举;若追求极致简洁且能接受类加载即初始化,饿汉式也足够可靠。避免使用没加 volatile 的双重检查锁,也别用简单的懒汉式(非同步)——它在多线程下会创建多个实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










