Java单列模式总结及实现
以下是Java单例模式的全面解析及主流实现方式:
一、单例模式核心特性
- 唯一实例:确保类只有一个实例对象
- 私有构造:禁止外部通过
new
创建实例 - 全局访问点:提供
static
方法获取唯一实例 - 典型应用:配置管理、线程池、日志系统等需全局唯一访问的场景
二、8种主流实现方式对比
1. 饿汉式(静态常量)
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
- 特点:线程安全但可能浪费内存
2. 懒汉式(线程不安全版)
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 多线程下可能创建多个实例}return instance;} }
- 风险:需配合
synchronized
解决线程安全问题
3. 双重检查锁(DCL)
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 关键点:
volatile
防止指令重排序
4. 静态内部类
public class Singleton {private Singleton() {}private static class Holder {static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return Holder.INSTANCE;} }
- 优势:懒加载+线程安全+无锁高性能
5. 枚举单例(Effective Java推荐)
public enum Singleton {
INSTANCE;
public void doSomething() { /* 业务方法 */ }
}
- 最佳实践:防反射攻击、序列化安全
三、Spring框架中的单例实践
- 容器级单例:Spring默认使用
ConcurrentHashMap
管理单例Bean - 与原生单例区别:Spring单例是IOC容器范围内唯一,而非JVM级
四、选型建议
实现方式 | 线程安全 | 懒加载 | 防反射 | 适用场景 |
---|---|---|---|---|
饿汉式 | ✔️ | ❌ | ❌ | 初始化耗时不敏感的场景 |
双重检查锁 | ✔️ | ✔️ | ❌ | 高并发且需延迟初始化 |
枚举 | ✔️ | ❌ | ✔️ | 需要绝对安全的场景 |
静态内部类 | ✔️ | ✔️ | ❌ | 主流推荐方案 |
最新趋势:枚举单例因其安全性成为企业级开发首选,而Kotlin的
object
语法进一步简化了单例实现。实际开发中应结合性能需求和安全要求选择方案。