单例模式:一个类创建对象不管多少个,只能去该类型一个对象的实例。(构造函数私有化,并私有定义一个唯一的实例对象)。
饿汉:还没有获取实例对象,实例对象就已经产生了,一定是线程安全的。
class single
{
public:
static single* getinstance()
{
return &instance;
}
private:
static single instance;
single()
{
}
single(const single&) = delete;
single& operator=(const single&) = delete;
};
single instance;
int main()
{
single* p1 = single::getinstance();
single* p1 = single::getinstance();
return 0;
}
懒汉:唯一的实例对象,第一次获取他时才会产生。
class single
{
public:
static single* getinstance() //存在竞态条件
{
if (instance == nullptr)
{
instance = new single();
}
return instance;
}
private:
static single *instance;
single()
{
}
single(const single&) = delete;
single& operator=(const single&) = delete;
};
single *instance = nullptr;
int main()
{
single* p1 = single::getinstance();
single* p1 = single::getinstance();
return 0;
}
下面看一下线程安全的版本。
std::mutex mut;
class single
{
public:
static single* getinstance()
{
if (instance == nullptr)
{
lock_guard<std::mutex> guard(mut);
if (instance == nullptr)
{
instance = new single();
}
}
return instance;
}
private:
static single *instance;
single()
{
}
single(const single&) = delete;
single& operator=(const single&) = delete;
};
single *instance = nullptr;
int main()
{
single* p1 = single::getinstance();
single* p1 = single::getinstance();
return 0;
}