多线程环境下,线程安全单例模式的方案避坑
在多线程环境下设计线程安全的单例模式,需确保实例的唯一性和初始化的线程安全性。
一、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)
-
实现原理:首次检查不加锁,第二次检查加锁,结合
volatile或std::atomic防止指令重排序。 -
代码示例:
#include <mutex> #include <atomic>class Singleton { public:static Singleton* getInstance() {Singleton* tmp = instance.load(std::memory_order_acquire);if (!tmp) {std::lock_guard<std::mutex> lock(mutex_);tmp = instance.load(std::memory_order_relaxed);if (!tmp) {tmp = new Singleton();instance.store(tmp, std::memory_order_release);
