线程安全的单例模式:饿汉模式懒汉模式

线程安全的单例模式:饿汉模式懒汉模式
目录一、单例模式二、饿汉模式1.特点2.实现关键3.代码实现三、懒汉模式1.特点2.实现关键3.代码实现一、单例模式单例模式一种典型的设计模式。应用场景一个类只能实例化一个对象向外提供统一访问接口的场景。作用对资源进行统一管理以及避免数据在不同对象中出现不同的体现。两种实现饿汉模式懒汉模式二、饿汉模式1.特点资源静态化。在程序初始化阶段完成对象的实例化。以空间换时间的思想在使用的时候就可以直接使用。优点在构造对象时不需要考虑线程安全问题。缺点初始化速度慢。2.实现关键1如何在程序初始化阶段完成对象的实例化解决方法在类中定义唯一的对象且用static修饰对象2如何让一个类只能有一个对象解决方法私有化构造函数3.代码实现#includeiostream class Singleton { private: int _data; static Singleton _eton; Singleton () : _data(0) {} public: static Singleton *GetInstance() { return _eton; } int *GetData() { return _data; } }; Singleton Singleton::_eton; int main() { std::cout Singleton::GetInstance() - GetData() std::endl; return 0; }三、懒汉模式1.特点对象在访问使用的时候才去实例化。一种延迟加载的思想用的时候再去加载节省资源。优点初始化速度快。缺点在构造对象时需要考虑线程安全问题。2.实现关键1如何在访问使用的时候采取实例化对象解决方法在类中定义唯一的对象指针且用static修饰2如何让一个类只能有一个对象解决方法私有化构造函数总结1.定义静态对象指针2.构造函数私有化3.加锁保护对象构造过程4.double check提高效率5.volatile关键字修饰防止编译器过度优化。3.代码实现#includeiostream #includemutex class Singleton { private: int _data; /*volatile*/static Singleton *_eton;//c语言实现时需要加上volatile关键字保持_eton内存可见性,防止编译器过度优化 static std::mutex _mutex; Singleton() {} public: static Singleton *GetInstance(){ if (_eton NULL) {//双层检测降低锁冲突概率 _mutex.lock();//加锁确保线程安全 if (_eton NULL) { _eton new Singleton(); } _mutex.unlock(); } return _eton; } int *GetData() { return _data; } }; Singleton* Singleton::_eton NULL; std::mutex Singleton::_mutex; int main() { std::cout Singleton::GetInstance() - GetData() std::endl; return 0; }