定义
单例顾名思义就是单一实例,程序类仅存在唯一实例,通过类中定义的接口获取访问这个实例。类似于一个全局变量,在程序的每个位置都可以获取到,常用于日志等地方。
代码实现
1、懒汉式实现
之所以叫懒汉的意思是,仅在使用的时候会新建实例。懒汉式的实现方式仅在访问量较小时,不涉及到多线程时使用。正常的懒汉式实现在创建实例时是存在线程安全的问题,下面是一个线程安全的懒汉式实现。
#include<iostream>
#include<thread>
#include<Windows.h>
#include<mutex>
using namespace std;
//懒汉式 线程安全
class Singleton
{
private:
Singleton()
{
cout << "Constructure Init"<<endl;
m_count = 0;
}
~Singleton()
{
cout << "Destructor End"<<endl;
}
static Singleton* m_instance;
static mutex _mutex;
int m_count;
public:
static Singleton* GetInstance()
{
if (m_instance == nullptr)
{
lock_guard<mutex> lock(_mutex);
if (m_instance == nullptr)
{
m_instance = new Singleton();
}
}
return m_instance;
}
void add();
};
Singleton* Singleton::m_instance = nullptr;
mutex Singleton::_mutex;
void fun()
{
Singleton::GetInstance()->add();
}
void Singleton::add()
{
Singleton::GetInstance()->m_count++;
cout << m_count << endl;
}
int main()
{
thread t1(fun);
thread t2(fun);
t1.join();
t2.join();
}
2、饿汉式实现
class Singleton
{
private:
Singleton()
{
std::cout << "Constructure Init" << std::endl;
m_count = 0;
}
~Singleton()
{
std::cout << "Destructor End" << std::endl;
}
static Singleton* m_instance;
int m_count;
public:
static Singleton* GetInstance()
{
return m_instance;
}
void add();
};
Singleton* Singleton::m_instance = new Singleton();
void fun()
{
Singleton::GetInstance()->add();
}
void Singleton::add()
{
Singleton::GetInstance()->m_count++;
cout << m_count << endl;
}
int main()
{
thread t1(fun);
thread t2(fun);
t1.join();
t2.join();
}
3、总结
两种输出的值均为下图,可见都是线程安全的,当访问量大时,选择饿汉式的实例方式。
文章评论