-
说明
-
分析
-
饿汉式
-
懒汉式
-
说明
- 优化一些, 真正调用时才创建。
-
优点
- 真正需要的时候才调用创建.
-
缺点
- 多线程不安全。
- 多个线程执行到
nullptr == instance
的时候,可能都满足,就都创建类并赋值. - 那么问题就是,单例不再真正的单例,而且还没办法释放.
-
案例
class Single { private: static Single* instance; Single(){ // some initial } public: static Single* getInstance(){ if(nullptr == instance) { instance = new Single(); } return instance; } }; Single* Single::instance = nullptr; int main(){ Single::getInstance(); }
-
-
线程安全
-
说明
- 懒汉式线程安全.
-
优点
- 实现简单.
-
缺点
- 并发不高.
-
案例
#include <mutex> class Single { private: static Single* instance; Single(){ // some initial } public: static Single* getInstance(){ std::mutex instance_mutex; instance_mutex.lock(); if(nullptr == instance) { instance = new Single(); } instance_mutex.unlock(); return instance; } }; Single* Single::instance = nullptr; int main(){ Single::getInstance(); }
- 因为每次访问都会互斥,可能导致其他睡眠.
-
-
线程安全错误优化
-
说明
- 创建的地方加锁
-
案例
#include <mutex> class Single { private: static Single* instance; Single(){ // some initial } public: static Single* getInstance(){ if(nullptr == instance) { std::mutex instance_mutex; instance_mutex.lock(); instance = new Single(); instance_mutex.unlock(); } return instance; } }; Single* Single::instance = nullptr; int main(){ Single::getInstance(); }
- 判断后再互斥创建,其实和懒汉式一样的.解锁了之后还是会继续执行并创建.
-
-
双重验证
-
说明
- 枷锁了之后再加判断.
-
好处
- 安全,效率高,且符合要求
-
案例
#include <mutex> class Single { private: static Single* instance; Single(){ // some initial } public: static Single* getInstance(){ if(nullptr == instance) { std::mutex instance_mutex; instance_mutex.lock(); if(nullptr == instance) { instance = new Single(); } instance_mutex.unlock(); } return instance; } }; Single* Single::instance = nullptr; int main(){ Single::getInstance(); }
-
-
可选
-
总结
C++ 03 单例模式
于 2021-12-04 12:03:39 首次发布