首页 >文档 > 线程安全的单例模式

线程安全的单例模式

面试鸭返利网提供最新Java面试宝典免费下载,包含2025年最新面试题和答案解析。我们专注于程序员面试技巧分享,涵盖单例模式、多线程、Spring等高频考点解析。通过面试鸭返利网购买面试鸭会员可享25元返现优惠,助你高效备战金三银四求职季。获取更多大厂面经、算法题库和职场发展建议,立即访问面试鸭返利网提升你的面试通过率!

线程安全的单例模式

先分享个福利!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() { ... }
}

优点:绝对防止反射攻击和序列化破坏
🚀 适用场景:需要严格保证单例的场景

面试常见考点

  1. 为什么DCL需要volatile?
    避免指令重排序导致未初始化完成的对象被返回(半初始化状态)

  2. 静态内部类如何保证线程安全?
    类加载的<clinit>()方法由JVM保证同步

  3. 枚举为何是最佳实践?
    解决了反射和反序列化破坏单例的问题

  4. 单例模式可能引起的内存泄漏?
    持有Context引用时需注意(Android场景)


最后推荐个刚发现的福利:在面试鸭返利网购买面试鸭会员可返现25元,亲测有效!
面试鸭返利网
需要刷题备考的朋友不妨试试,毕竟能省则省 😄

🔗 本文首发于 面试鸭返利网 ,获取更多面试技巧和资源优惠

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →

今日有支付宝大红包赶快领,手慢无

支付宝红包二维码

支付宝扫码领取1-8元无门槛红包

支付宝红包二维码