单例模式 Singleton
-
饿汉模式
class Singleton { public: static Singleton* GetInstance() { return &instance_; } private: Singleton(){} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; static Singleton instance_; };
- 特点
- 程序启动时就创建一个唯一的实例对象, 因为对象是静态的在数据段
- 如果单例类初始化功能太复杂,会导致进程启动慢
- 由于对象初始化顺序被编译器控制,用户不能确定启动顺序,对依赖单例加载不利
- 特点
-
懒汉模式
class Singleton { public: static Singleton* GetInstance() { if(instance_ == nullptr) // 双重锁定,优化 { std::lock_guard<std::mutex> guard(mut_); if(instance_ == nullptr) { instance_ = new Singleton; static GC gc; // 静态变量将会随着程序结束而被释放 } } return instance_; } class GC { public: ~GC() { if (instance_) { delete instance_; instance_ = nullptr; } } }; private: Singleton(){} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; static Singleton* instance_; static std::mutex mut_; }; Singleton* Singleton::instance_ = nullptr; std::mutex Singleton::mut_ = nullptr;
- 特定
- 解决进程启动慢,将构造函数中逻辑复杂或者其资源占用严重的对象在运行时实例化
- 多线程中不会产生竟态
- 双重锁定是优化避免每次都需要获取锁,单例模式只有在第一次实例化时才会发生竟态
- 特定