1.什么是单例模式?
单例模式是指在内存中只会创建且仅创建一次对象的设计模式。
2.单例模式分两种
饿汉模式,懒汉模式。
一个好的单例模式需要具备四种条件:全局只有一个实例:static 特性,禁止用户自己声明并定义实例(构造函数设为private);线程安全;禁止拷贝和赋值;使用static类成员函数(用户通过接口获取实例)。
(1).饿汉模式
在类加载时已经创建好该单例对象,等待被程序使用
代码实现
class Single {
private:
Single() {}
Single(const Single&) = delete;
Single& operator=(const Single&) = delete;
static Single* s = new Single();
public:
~Single(){}
static Single* GetSingle() {
return s;
}
};
(2).懒汉模式
在真正需要使用对象时才去创建该单例类对象
代码实现
class Single {
private:
Single() {}
Single(const Single&) = delete;
Single& operator=(const Single&) = delete;
static Single* s;
public:
~Single(){}
static Single* GetSingle() {
if (s == nullptr) {
s = new Single();
}
return s;
}
};
3. 懒汉模式的存在的问题
(1).会出现多线程竞争问题(线程安全问题,加锁解决)
(2).还会出现内存泄露(用智能指针解决)
4.懒汉模式解决线程安全问题最好的办法:设置局部静态变量
如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。
这样保证了并发线程在获取静态局部变量的时候一定是初始化过的,所以具有线程安全性。
代码实现
class CSingleton
{
public:
~ CSingleton(){};
CSingleton(const CSingleton&)=delete;
CSingleton& operator=(const CSingleton&)=delete;
static CSingleton & GetInstance()
{
static CSingleton _instance;
return _instance;
}
private:
CSingleton(){};
};