单例模式:静态局部变量方式

一种简单的单例模式,使用静态局部变量。

为什么是静态局部变量可以保证线程安全性?

原因是Magic Static特性。如果变量在初始化时,并发线程同时进入到static声明语句,并发线程会阻塞等待初始化结束。这样可以保证在获取静态局部变量的时候一定是初始化过的,所以具有线程安全性,同时也避免了new对象时指令重排序造成对象初始化不完全的现象。并且相比较与使用智能指针以及mutex来保证线程安全和内存安全来说,这样做能够提升效率。

具体实现:

class Singleton{
private:
	Singleton(){
		cout << "构造" << endl;
	}
	Singleton(const Singleton& t){}
	Singleton operator=(const Singleton& t){}
public:
	//为什么能够保证线程的安全性及防止指令重排序导致的对象部分初始化问题
	//原因是Magic Static特性,如果变量在初始化时,并发线程同时进入到static声明语句,并发线程会阻塞等待初始化结束。
	//这样可以保证在获取静态局部变量的时候一定是初始化过的,所以具有线程安全性。
	static Singleton& getInstance(){
		static Singleton instance;
		return instance;
	}
	~Singleton(){
		cout << "析构" << endl;
	}

};


int main(){
	//shared_ptr<SignleInstance> s1 = SignleInstance::getInstance();
	{
		Singleton& instance_1 = Singleton::getInstance();
		Singleton& instance_2 = Singleton::getInstance();
	}
	system("pause");
	return 0;
}

注:当然知道这个,还是需要知道双重检查锁和智能指针如何实现线程安全和内存安全的单例模式.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值