单例模式——C++实现线程安全的单例
来源:互联网 发布:java反射原理简单介绍 编辑:程序博客网 时间:2024/05/22 02:27
一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.
使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
1、静态成员实例的懒汉模式:
2、内部静态实例的懒汉模式
这里需要注意的是,C++0X以后,要求编译器保证内部静态变量的线程安全性,可以不加锁。但C++ 0X以前,仍需要加锁。
二、饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。
由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。
故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
- #include <iostream>>
- using namespace std;
- class Singleton
- {
- public:
- static Singleton *GetInstance();
- private:
- Singleton()
- {
- cout << "Singleton ctor" << endl;
- }
- ~Singleton()
- {
- cout << "Singleton dtor" << endl;
- }
- static Singleton *m_pInstance;
- class Garbo
- {
- public:
- ~Garbo()
- {
- if (Singleton::m_pInstance)
- {
- cout << "Garbo dtor" << endl;
- delete Singleton::m_pInstance;
- }
- }
- };
- static Garbo garbo;
- };
- Singleton::Garbo Singleton::garbo; // 一定要初始化,不然程序结束时不会析构garbo
- Singleton *Singleton::m_pInstance = NULL;
- Singleton *Singleton::GetInstance()
- {
- if (m_pInstance == NULL)
- m_pInstance = new Singleton;
- return m_pInstance;
- }
- int main()
- {
- Singleton *p1 = Singleton::GetInstance();
- Singleton *p2 = Singleton::GetInstance();
- if (p1 == p2)
- cout << "p1 == p2" << endl;
- return 0;
- }
输出结果如下:
Singleton ctor
p1 == p2
Garbo dtor
Singleton dtor
0 0
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例 .
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例
- 单例模式——C++实现线程安全的单例
- 单例模式——C++(线程安全)
- 设计模式 - 线程安全的单例模式(C#)
- 线程安全单例模式(C++)
- 线程安全单例模式(C++)
- 线程安全的饿汉式——单例模式
- object-c 单例模式的线程安全
- 线程安全的单例模式的实现
- 线程安全的单例模式 的各种实现 总结
- 线程安全的单例模式的实现
- 温度值的转换
- 织梦DedeCMS v5.7完美实现导航条下拉菜单
- 歪打正着解决了一个AJAX跨域的问题
- mysql添加索引造成的影响
- 开博目标:单词拆解.apk,学习体会
- 单例模式——C++实现线程安全的单例
- 移动互联网入口战
- SEO培训行业存在的现象
- Java 实现迭代器(Iterator)模式
- seo培训服务谈单技巧
- 织梦官方视频教程 dedecms使用教程 适合新手
- .NET框架 PropertyGrid控件 无法修改值怎么回事?
- inline hook【001】
- hadoop2.0的datanode多目录数据副本存放策略