单例模式~

单例:对于一些类来说,只有一个实例很重要。保证类只有一个实例,并提供一个访问它的全局访问点
声明一个getInstance()静态方法来返回其所属类的一个相同实例
对构造函数做私有化处理,
拷贝构造函数,赋值运算符重载,做delete处理
多线程下要特殊处理

#include
#include
#include
#include
using namespace std;

//多线程下的单例模式
class Singleton{
private:
	string m_value;
	Singleton(const string value):m_value(value){};
	~Singleton(){}
public:
	Singleton(Singleton& othrer) = delete;
	Singleton(const Singleton& other) = delete;
	void operator=(const Singleton&) = delete;
	string value()const{ return m_value; }

	static Singleton* getInstance(const string& value);//静态函数要在外部定义

private:
	static Singleton* m_instance;
	static mutex m_mutex;//锁
};

Singleton* Singleton::m_instance = nullptr;
mutex Singleton::m_mutex;

Singleton* Singleton::getInstance(const string& value)
{
	//方法一:
	//lock_guard lock(m_mutex);//加锁直接锁住,整个函数内部,但是效率较低
	//if (m_instance == nullptr)//两个线程同时进入判断就会出现两个实例
	//{
	//	m_instance = new Singleton(value);
	//}
	//return m_instance;

	//方法二:
	//C++11初始化一个变量时线程安全的
	static Singleton* instance = new Singleton(value);
	return instance;
}

void Cat()
{
	Singleton* singleton = Singleton::getInstance("Cat");
	cout<<singleton->value()<<'\n';
}

void Dog()
{
	Singleton* singleton = Singleton::getInstance("Dog");
	cout << singleton->value() << '\n';
}
int main()
{
	
	thread t1(Cat);
	thread t2(Dog);//有安全隐患,会创建两个实例
	t1.join();
	t2.join();

}
//int main()
//{
//	Cat();
//	Dog();//单线程情况都是Cat
//	cout << "hello world!";
//}

单例模式~_第1张图片

你可能感兴趣的:(设计模式,单例模式)