线程安全的单例模式

1.饿汉模式

//饿汉模式
template<class T>
class Singleton {
private:
	Singleton() {};
private:
	static T *m_instance;//静态成员需要类内声明,类外定义;
	Singleton(const Singleton&) {};//禁止拷贝
	Singleton& operator = (const Singleton&) {};//禁止赋值
public:
	static T* getInstance()
	{
		return m_instance;//静态成员函数没有this指针,只能访问静态成员,所以m_instance要声明为静态;
	}
};
template<class T>
T* Singleton<T>::m_instance = new T();

2.懒汉模式

//懒汉模式
template<class T>
class SingleTon {
private:
	SingleTon() {};
	SingleTon(const SingleTon&) {};
	SingleTon& operator=(const SingleTon&) {};
	static T* m_instance;
	static mutex mtx;
public:
	static T* getInstance()
	{
		if (m_instance == nullptr)
		{
			mtx.lock();
			T *p = new T();//不直接m_instance=new T(),是为了防止new T()过程中返回了指针,
			m_instance = p; //但构造函数的初始化还没完成,而此时刚好有另一个线程访问了     
			mtx.unlock();
		}
		return m_instance;
	}
};
template<class T>
T* SingleTon<T>::m_instance = nullptr;
template<class T>
mutex SingleTon<T>::mtx;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值