单例模式:全局唯一实例,提供一个很容易获取这个实例的接口


线程安全的单例:

懒汉模式(Lazy Loading):第一次获取对象时才创建对象

classSingleton{public://获取唯一实例的接口函数staticSingleton*GetInstance(){//双重检查,提高效率,避免高并发场景下每次获取实例对象都进行加锁if(_sInstance==NULL){std::lock_guard<std::mutex>lock(_mtx);if(_sInstance==NULL){Singleton*tmp=newSingleton;MemoryBarrier();//内存栅栏,防止编译器优化_sInstance=tmp;}}return_sInstance;}staticvoidDelInstance(){if(_sInstance){delete_sInstance;_sInstance=NULL;}}voidPrint(){std::cout<<_data<<std::endl;}private://构造函数定义为私有,限制只能在类内实例化对象Singleton():_data(10){}//防拷贝Singleton(constSingleton&);Singleton&operator=(constSingleton&);private:staticstd::mutex_mtx;//保证线程安全的互斥锁staticSingleton*_sInstance;//指向实例的指针定义为静态私有,这样定义静态成员获取对象实例int_data;//单例类里面的数据};


饿汉模式(Eager Loading):第一次获取对象时,对象已经创建好。

简洁、高效、不用加锁,但是在某些场景下会有缺陷。

/*方式一*/classSingleton{public:staticSingleton*GetInstance(){staticSingletonsInstance;return&sInstance;}voidPrint(){std::cout<<_data<<std::endl;}private:Singleton():_data(10){}Singleton(constSingleton&);Singleton&operator=(constSingleton&);private:staticSingleton*_sInstance;int_data;};voidTestSingleton(){Singleton::GetInstance()->Print();}

/*方式二*/classSingleton{public:staticSingleton*GetInstance(){staticSingletonsInstance;return&sInstance;}staticvoidDelInstance(){if(_sInstance){delete_sInstance;_sInstance=NULL;}}voidPrint(){std::cout<<_data<<std::endl;}private:Singleton():_data(10){}Singleton(constSingleton&);Singleton&operator=(constSingleton&);private:staticSingleton*_sInstance;int_data;};Singleton*Singleton::_sInstance=newSingleton;voidTestSingleton(){Singleton::GetInstance()->Print();Singleton::DelInstance();}