目录
单例(Singleton)概述
特点:只能实例化一次的特殊类,这个实例被所有的模块所共享
应用:只能有一个对象的使用场景,如日志,显卡等设备
总结工作中使用到的:懒汉式(非线程安全),改进懒汉式(线程安全),饿汉式(线程安全)
方法 | 特点 | 特点 |
懒汉式 | 时间换空间 | 1.单线程没有问题 2.多线程使用,可能产生多个对象 |
改进懒汉式 | 改进懒汉式方法,做到线程安全 | |
饿汉式 | 空间换时间 | 初始化就创建,保证线程安全 |
1.懒汉式
特点:懒汉式对于单线程可以使用,但是对于多线程可能生产多个对象,是非线程安全的
如下:
#include <iostream>
using namespace std;
class ConfigFile
{
private:
ConfigFile()
{
}
static ConfigFile* m_instance;
public:
static ConfigFile* GetInstance()
{
if(NULL==m_instance)
{
m_instance=new ConfigFile();
}
return m_instance;
}
void printf_info()
{
cout<<"helloworld"<<endl;
}
};
ConfigFile* ConfigFile::m_instance=NULL;
int main()
{
ConfigFile* instance=ConfigFile::GetInstance();
instance->printf_info();
return 0;
}
2.改进懒汉式
特点:改进上一张方案,保证了线程安全,而且只有第一次生产对象的加锁
#include <iostream>
#include <mutex>
using namespace std;
class ConfigFile
{
private:
ConfigFile()
{
}
static ConfigFile* m_instance;
static mutex m_mutex;
public:
static ConfigFile* GetInstance()
{
if(NULL==m_instance)
{
m_mutex.lock();
if(NULL==m_instance)
m_instance=new ConfigFile();
m_mutex.unlock();
}
return m_instance;
}
void printf_info()
{
cout<<"helloworld"<<endl;
}
};
ConfigFile* ConfigFile::m_instance=NULL;
mutex ConfigFile::m_mutex;
int main()
{
ConfigFile* instance=ConfigFile::GetInstance();
instance->printf_info();
return 0;
}
3.饿汉式
特点:开始创建实例,以空间换时间,保证了线程安全
#include <iostream>
#include <mutex>
using namespace std;
class ConfigFile
{
private:
ConfigFile()
{
}
public:
static ConfigFile* GetInstance()
{
static ConfigFile m_instance;
return &m_instance;
}
void printf_info()
{
cout<<"helloworld"<<endl;
}
};
int main()
{
ConfigFile* instance=ConfigFile::GetInstance();
instance->printf_info();
return 0;
}
4.单例销毁
#include <stdlib.h>
int atexit(void (*function)(void));
功能:注册终止函数,即main函数结束之后调用。
用法:接受一个无参的函数
#include <iostream>
#include <mutex>
using namespace std;
#include <iostream>
#include <mutex>
using namespace std;
class ConfigFile
{
private:
ConfigFile()
{
}
static ConfigFile* m_instance;
static mutex m_mutex;
public:
static ConfigFile* GetInstance()
{
if(NULL==m_instance)
{
m_mutex.lock();
if(NULL==m_instance)
{
m_instance=new ConfigFile();
atexit(destroy);//在新建对象时,注册结束函数
}
m_mutex.unlock();
}
return m_instance;
}
static void destroy()
{
if(m_instance)
{
cout<<"destroy m_instance"<<endl;
delete m_instance;
}
}
void printf_info()
{
cout<<"helloworld"<<endl;
}
};
ConfigFile* ConfigFile::m_instance=NULL;
mutex ConfigFile::m_mutex;
int main()
{
ConfigFile* instance=ConfigFile::GetInstance();
instance->printf_info();
return 0;
}
参考:
单例模式 C++实现_stt2019-CSDN博客_单例模式c++实现