当前位置: 首页 > news >正文

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

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

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);