这个例子是线程安全的吗
时间: 2024-01-26 09:14:06 浏览: 17
不是线程安全的。当多个线程同时调用getInstance()方法时,可能会导致创建多个Singleton对象,因为它们都检查instance是否为nullptr,然后同时创建一个新的实例。
要使单例模式线程安全,可以使用互斥锁来保护getInstance()方法。下面是一个线程安全的示例:
```c++
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mtx); // 使用互斥锁保护getInstance()方法
if(instance == nullptr) {
instance = new Singleton();
}
return instance;
}
void someMethod() {
// 该单例类的一些方法
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
int main() {
Singleton* obj1 = Singleton::getInstance();
Singleton* obj2 = Singleton::getInstance();
if(obj1 == obj2) {
std::cout << "obj1和obj2是同一个实例" << std::endl;
}
return 0;
}
```
在这个示例中,我们使用std::mutex类创建一个互斥锁对象mtx,并在getInstance()方法内使用std::lock_guard类对它进行锁定。这样一来,同时调用getInstance()方法的线程将被阻塞,直到前一个线程完成并释放互斥锁。这样就可以确保只有一个Singleton实例被创建。