代码改变世界

多线程环境下,线程安全单例模式的方案避坑 - 详解

2025-12-02 12:17  tlnshuju  阅读(0)  评论(0)    收藏  举报

在多线程环境下设计线程安全的单例模式,需确保实例的唯一性初始化的线程安全性


一、C++实现线程安全单例模式

1. 饿汉式(Eager Initialization)
  • 实现原理:类加载时直接创建实例,天然线程安全。

  • 代码示例

    class Singleton {
    public:
        static Singleton& getInstance() {
            static Singleton instance; // C++11后局部静态变量初始化线程安全
            return instance;
        }
    private:
        Singleton() = default; // 禁用拷贝构造和赋值
        Singleton(const Singleton&) = delete;
        Singleton& operator=(const Singleton&) = delete;
    };
  • 特点

    • 优点:实现简单,线程安全,无需额外同步。

    • 缺点:无法懒加载,程序启动时即占用资源。

  • 适用场景:资源占用小且频繁使用的场景。

2. 双重检查锁定(Double-Checked Locking, DCLP)
  • 实现原理:首次检查不加锁,第二次检查加锁,结合volatilestd::atomic防止指令重排序。

  • 代码示例

    #include 
    #include 
    class Singleton {
    public:
        static Singleton* getInstance() {
            Singleton* tmp = instance.load(std::memory_order_acquire);
            if (!tmp) {
                std::lock_guard lock(mutex_);
                tmp = instance.load(std::memory_order_relaxed);
                if (!tmp) {
                    tmp = new Singleton();
                    instance.store(tmp, std::memory_order_release);