单例模式
保证一个类仅有一个实例,并提供一个该实例的全局访问点
在软件系统中,经常有这样一些特殊的类,必须保证他们 在系统中只存在一个实例,才能确保它们的逻辑正确性, 以及良好的效率
应用场景:
DBPool 、读取配置文件
单例模式分类:
1、懒汉式 -- 需要使用单例的时候,才进行初始化
2、饿汉式 -- 未调用单例的时候,已经进行初始化
写一个单例模式的demo
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
//设计线程的个数
#define PTHREAD_NUM 20
//懒汉式 饿汉式 单例模式的选型
#define SINGELTON_SELECTOR 0
//单例模式
#if SINGELTON_SELECTOR
//懒汉式 -- 调用的时候才初始化
class Singleton{
private:
Singleton(){
cout<<"Singleton construct 1111\n";
}
~Singleton(){
cout<<"Singleton destruct 1111\n";
}
//禁止拷贝构造
Singleton(const Singleton &si) = delete;
//禁止等号赋值
Singleton & operator=(const Singleton &si) = delete;
public:
static Singleton * getInstance(){
static Singleton m_singleton;
return &m_singleton;
}
};
#else
//饿汉式 -- 调用之前就已经初始化好,调用的时候直接返回地址
class Singleton{
private:
Singleton(){
cout<<"Singleton construct 2222\n";
}
~Singleton(){
cout<<"Singleton destruct 2222\n";
}
//禁止拷贝构造
Singleton(const Singleton &si) = delete;
//禁止等号赋值
Singleton & operator=(const Singleton &si) = delete;
static Singleton m_singleton;
public:
static Singleton * getInstance(){
return &m_singleton;
}
};
Singleton Singleton::m_singleton;
#endif
//定义一个互斥锁,保证只有一个线程在打印 单例变量的地址
static mutex m;
void print_address()
{
Singleton* singleton = Singleton::getInstance();
m.lock();
cout<<singleton<<en