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

需要刷题备考的朋友不妨试试,毕竟能省则省 😄
🔗 本文首发于 面试鸭返利网 ,获取更多面试技巧和资源优惠
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭小程序码

美团大额优惠券,给自己加个鸡腿吧!

今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包
