分别写出饿汉和懒汉线程安全的单例模式
时间: 2023-07-26 17:38:10 浏览: 113
饿汉线程安全单例模式示例代码:
```cpp
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
```
在上述代码中,我们将构造函数设为私有,防止外部直接实例化对象。getInstance() 方法是一个静态方法,用于返回单例对象的引用。在其内部,我们使用了静态局部变量的方式来实现单例,这种方式天生就是线程安全的。
懒汉线程安全单例模式示例代码:
```cpp
class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initFlag_, []() {
instance_ = new Singleton();
});
return *instance_;
}
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton* instance_;
static std::once_flag initFlag_;
};
Singleton* Singleton::instance_ = nullptr;
std::once_flag Singleton::initFlag_;
```
在上述代码中,我们同样将构造函数设为私有,防止外部直接实例化对象。getInstance() 方法同样是一个静态方法,用于返回单例对象的引用。在其内部,我们使用了 std::call_once() 函数和 std::once_flag 对象来保证单例对象只被创建一次。在函数内部,我们首先检查 instance_ 是否为空,如果为空,则调用 std::call_once() 函数来保证 instance_ 只被创建一次。由于 std::call_once() 函数是线程安全的,因此这种方式也是线程安全的。
阅读全文