1 什么是单例模式?
- 单例模式:一个类不管创建多少次对象,永远只能得到该类型一个对象的实例。
- 常用例子:日志模块,数据库模块。
两种分类
- 饿汉式单例模式:还没有获取实例对象,实例对象就已经产生了,一定是线程安全的。
- 懒汉式单例模式:唯一的实例对象,直到第一次获取它的时候才产生。
两个问题:懒汉式单例模式是不是线程安全的呢?getInstance函数是不是可重入函数?
2 饿汉式单例模式
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* getInstance() // 3.获取类唯一实例对象的接口方法
{
return &instance;
}
private:
static Singleton instance; // 2.定义一个唯一的类的实例对象
Singleton() // 1.构造函数私有化
{
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
Singleton Singleton::instance;
int main()
{
Singleton *p1 = Singleton::getInstance();
Singleton *p2 = Singleton::getInstance();
Singleton *p3 = Singleton::getInstance();
return 0;
}
3 线程安全的懒汉式单例模式
#include <iostream>
#include <mutex>
using namespace std;
std::mutex mtx;
class Singleton
{
public:
static Singleton *getInstance() // 3.获取类唯一实例对象的接口方法
{ // 锁+双重判断
// lock_guard<std::mutex> guard(mtx); // 锁的粒度太大了
if (instance == nullptr)
{
lock_guard<std::mutex> guard(mtx);
if (instance == nullptr)
{
/*
开辟内存
构造对象
给instance赋值
*/
instance = new Singleton();
}
}
return instance;
}
private:
static Singleton *instance; // 2.定义一个唯一的类的实例对象
Singleton() // 1.构造函数私有化
{
}
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
};
Singleton *Singleton::instance = nullptr;
int main()
{
Singleton *p1 = Singleton::getInstance();
Singleton *p2 = Singleton::getInstance();
Singleton *p3 = Singleton::getInstance();
return 0;
}