设计模式
单例模式
一个类不管创建多少次对象,永远只能得到该类型一个对象的实例
饿汉式
还没有获取实例对象,实例对象就已经产生了
一定是线程安全的
// 饿汉式
class Single
{
public:
static Single* getInstance() // 3.获取类的唯一实例对象的接口方法
{
return &instance;
}
private:
static Single instance; // 2.定义一个唯一的实例对象
Single() // 1.构造函数私有化
{
}
Single(const Single&) = delete;
Single& operator=(const Single&) = delete;
};
Single Single::instance;
懒汉式
唯一的实例对象,直到第一次获取的时候,才产生
std::mutex mtx;
// 懒汉式
class Single
{
public:
static Single* getInstance() // 3.获取类的唯一实例对象的接口方法
{
// lock_guard<std::mutex> guard(mtx); // 此处锁的粒度太大
if (instance == nullptr)
{
lock_guard<std::mutex> guard(mtx);
if (instance == nullptr) // 双检锁
{
instance = new Single();
}
}
return instance;
}
private:
static Single *volatile instance; // 2.定义一个唯一的实例对象
Single(){} // 1.构造函数私有化
Single(const Single&) = delete;
Single& operator=(const Single&) = delete;
};
Single*volatile Single::instance;
第二种精简实现
// 懒汉式
class Single
{
public:
static Single* getInstance()
{
// 函数局部变量的初始化,在汇编指令上已经自动添加线程互斥指令了
static Single instance;
return &instance;
}
private:
Single(){}
Single(const Single&) = delete;
Single& operator=(const Single&) = delete;
};