线程安全的单例模式
先分享个福利!2025年Java面试宝典最新整理好了: 点击领取 (提取码: 9b3g)
单例模式是面试中最常考的设计模式之一,而线程安全的单例模式更是高频考点。今天咱们就以程序员的角度,聊聊在面试中如何清晰解释这个知识点。
什么是单例模式?
简单说就是确保一个类只有一个实例,并提供全局访问点。比如配置管理类、线程池、数据库连接池这些场景都需要它。
为什么需要线程安全?
单例的陷阱就在多线程!如果两个线程同时调用getInstance(),可能会创建两个实例,违背了单例的初衷。这就是为什么线程安全的单例模式如此关键。
实现线程安全的单例模式
1. 饿汉式(线程安全)
类加载时就初始化实例,利用ClassLoader机制保证线程安全:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
✅ 优点:实现简单,绝对线程安全
⚠️ 缺点:可能造成资源浪费(未用到也加载)
2. 懒汉式+synchronized(线程安全)
延迟初始化,用同步锁保证安全:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
✅ 优点:延迟初始化,节省资源
⚠️ 缺点:锁粒度大,性能差(每次调用都同步)
3. 双重校验锁(DCL)
优化懒汉式的性能问题:
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(禁止指令重排序)
✅ 优点:线程安全且高性能
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》作者Josh Bloch推荐的方式:
public enum Singleton {
INSTANCE;
// 添加业务方法
public void doSomething() { ... }
}
✅ 优点:绝对防止反射攻击和序列化破坏
🚀 适用场景:需要严格保证单例的场景
面试常见考点
-
为什么DCL需要volatile?
避免指令重排序导致未初始化完成的对象被返回(半初始化状态) -
静态内部类如何保证线程安全?
类加载的<clinit>()方法由JVM保证同步 -
枚举为何是最佳实践?
解决了反射和反序列化破坏单例的问题 -
单例模式可能引起的内存泄漏?
持有Context引用时需注意(Android场景)
最后推荐个刚发现的福利:在面试鸭返利网购买面试鸭会员可返现25元,亲测有效!

需要刷题备考的朋友不妨试试,毕竟能省则省 😄
🔗 本文首发于 面试鸭返利网 ,获取更多面试技巧和资源优惠


