在单例模式的懒汉式实现中,为减少高并发场景下的性能损耗,可以采用双重检查锁定(Double - Checked Locking)机制,并结合 volatile 关键字来优化。以下是优化后的代码示例:
cpp
#include <iostream>
#include <thread>
#include <mutex>
class Singleton {
public:
// 获取单例实例的静态方法
static Singleton* getInstance() {
// 第一次检查,若实例已存在,直接返回,避免不必要的锁竞争
if (instance == nullptr) {
std::lock_guard<std::mutex> guard(mutex);
// 第二次检查,确保在获取锁后再次确认实例是否已创建
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
private:
// 单例实例指针
static volatile Singleton* instance;
// 互斥锁,用于保护单例实例的创建过程
static std::mutex mutex;
// 私有构造函数,防止外部直接创建对象
Singleton() {}
};
// 初始化单例实例指针为nullptr
volatile Singleton* Singleton::instance = nullptr;
// 初始化互斥锁
std::mutex Singleton::mutex;
int main() {
// 创建多个线程来测试单例模式在高并发下的情况
std::thread t1([]() { Singleton* s1 = Singleton::getInstance(); });
std::thread t2([]() { Singleton* s2 = Singleton::getInstance(); });
t1.join();
t2.join();
return 0;
}
在上述代码中, volatile 关键字确保了 instance 变量在多线程环境下的可见性,即当一个线程修改了 instance 的值,其他线程能够立即看到这个变化。双重检查锁定机制则避免了在每次调用 getInstance 方法时都进行加锁操作,只有在第一次创建实例时才会加锁,从而提高了并发性能。