单例模式的意图:一个类只能有一个实例。
//非线程安全版本
1 class Singleton{ 2 private: 3 Singleton(); 4 Singleton(const Singleton &); 5 public: 6 static Singleton* init; 7 static Singleton* getSingleton(); 8 }; 9 Singleton* Singleton::init = nullptr; 10 Singleton * Singleton::getSingleton() { 11 if(init == nullptr){ 12 init = new Singleton(); 13 } 14 return init; 15 }
//线程安全版本,但是加锁的代价过高
//多个线程读的时候其实不需要锁,面对高并发的情况,这个锁的代价比较高
Singleton * Singleton::getSingleton() { Lock lock; if(init == nullptr){ init = new Singleton(); } return init; }
//双检查锁,但是由于内存读写reorder不安全。
//锁后检查避免多次实例,锁前检查防止两个线程都进了11行之后12行之前,lock等待了之后又实例化。
Singleton * Singleton::getSingleton() { 11 if(init == nullptr){ 12 Lock lock; 13 if(init == nullptr){ 14 init = new Singleton(); 15 } 16 } 17 return init; 18 }
第14行,执行的顺序是:1.先分配内存,2.调用构造器 3.把这片内存地址值返回给init;
但是由于线程在指令层次抢时间片;那么实际的执行指令顺序未必和上述相同。
//c++11版本之后的跨平台实现
标签:11,Singleton,nullptr,模式,init,getSingleton,线程,c++,单例 From: https://www.cnblogs.com/cotoyo25/p/16618905.html