设计一个单例模式
懒汉
/*
单例模式首先需要一个私有的、静态的单例对象(或者指针);
接着需将构造函数声明为私有;
最后开放一个公有接口用于获取这个单例对象(由于外部无法获得本类的一个对象,也就无法调用非静态方法,因此需将本接口声明为静态)。
*/
#include <mutex>
#include<iostream>
#include<thread>
#include<Windows.h>
using namespace std;
class Singleton//懒汉模式
{
private:
static mutex mtx; //加了个静态成员锁
Singleton();
static Singleton* p;
public:
static Singleton* getInstance();
};
Singleton* Singleton::p = nullptr;
mutex Singleton::mtx;
Singleton* Singleton::getInstance()
{
if (nullptr == p)
{
//由于懒汉模式在使用时才可能创建单例,因此可能出现两个线程并发创建单例的情况
mtx.lock(); //加锁
if (p == nullptr) //这里需要额外判断一次,避免加锁前瞬间的并发创建冲突
{
p = new Singleton();
}
mtx.unlock(); //解锁
}
return p;
}
Singleton::Singleton()
{
cout << "Create a Singleton" << endl;
}
饿汉
class Singleton//饿汉模式
{
private:
Singleton() {}
static Singleton* p;
public:
static Singleton* getInstance()
{
return p;
}
};
Singleton* Singleton::p = new Singleton();