单例模式有饿汉模式和懒汉模式,饿汉模式:因为将该单例对象定义为static变量,程序启动即将其构造完成了。懒汉模式:存在线程安全的问题,解决方案是Double-Checked Locking Pattern (DCLP)。使用两次判断来解决线程安全问题并且提高效率。
饿汉模式
class Singleton {
public:
static Singleton* GetInstance() {
return singleton_;
}
static void DestreyInstance() {
if (singleton_ != NULL) {
delete singleton_;
}
}
private:
// 防止外部构造。
Singleton() = default;
// 防止拷贝和赋值。
Singleton& operator=(const Singleton&) = delete;
Singleton(const Singleton& singleton2) = delete;
private:
static Singleton* singleton_;
};
Singleton* Singleton::singleton_ = new Singleton;
//调用结束后要手动释放内存
懒汉模式
//在C++11环境下编译
class Singleton {
public:
static Singleton& GetInstance() {
static Singleton intance;
return intance;
}
~Singleton() = default;
private:
Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
局部静态变量可以延迟对象的构造,等到第一次调用时才进行构造,C++11中静态变量的初始化时线程安全的 。
还有别的方式比如实现,需要手动释放内存的,就用智能指针实现,加锁+两次判空在new的时候,有可能还没完成赋值。这时候解决办法可以用临时的变量去构造,然后在赋值给instance变量。或者使用std::call_once。
参考链接:线程安全的单例模式
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2019/03/10 16:15