设计模式(十四)Singleton
来源:互联网 发布:天尚网络机顶盒 编辑:程序博客网 时间:2024/05/22 09:46
1.使用场景:在某些情况下,某个类只能有一个实例
2.定义:保证一个类仅有一个实例,并提供一个该实例的全局访问点
3.步骤:
-构造函数生命为私有
-设置静态变量
-考虑多线程的安全
(双检查锁由于内存读写
reorder并不安全)
Singleton设计模式代码:
class Singleton{private: Singleton(); Singleton(const Singleton& other);public: static Singleton* getInstance(); static Singleton* m_instance;};Singleton* Singleton::m_instance=nullptr;//线程非安全版本Singleton* Singleton::getInstance() { if (m_instance == nullptr) { m_instance = new Singleton(); } return m_instance;}//线程安全版本,但锁的代价过高Singleton* Singleton::getInstance() { Lock lock; if (m_instance == nullptr) { m_instance = new Singleton(); } return m_instance;}//双检查锁,但由于内存读写reorder不安全Singleton* Singleton::getInstance() { if(m_instance==nullptr){ Lock lock; if (m_instance == nullptr) { m_instance = new Singleton(); } } return m_instance;}//C++ 11版本之后的跨平台实现 (volatile)std::atomic<Singleton*> Singleton::m_instance;std::mutex Singleton::m_mutex;Singleton* Singleton::getInstance() { Singleton* tmp = m_instance.load(std::memory_order_relaxed); std::atomic_thread_fence(std::memory_order_acquire);//获取内存fence if (tmp == nullptr) { std::lock_guard<std::mutex> lock(m_mutex); tmp = m_instance.load(std::memory_order_relaxed); if (tmp == nullptr) { tmp = new Singleton; std::atomic_thread_fence(std::memory_order_release);//释放内存fence m_instance.store(tmp, std::memory_order_relaxed); } } return tmp;}
阅读全文
0 0
- 设计模式(十四)Singleton
- 设计模式---单子(Singleton)
- 单子(Singleton)设计模式
- 单子(Singleton)设计模式
- Singleton设计模式(C++)
- [设计模式]单例类(Singleton)
- 设计模式(一):Singleton模式
- 设计模式(一):Singleton模式
- 设计模式---单例模式(singleton)
- 设计模式--单件模式(Singleton)
- 设计模式--单例模式(Singleton)
- 设计模式--单例模式(Singleton)
- 设计模式之(四)Singleton模式
- 设计模式-单例模式(Singleton)
- 设计模式(一)Singleton 模式
- 【设计模式】-单例模式(Singleton)
- 设计模式---单例模式(singleton)
- 设计模式 -- 单例模式(Singleton)
- Kotlin数据类型
- String和StringBuffer的区别
- html的下拉列表和表格
- Android 手势
- R语言数据清洗与规整-回归模型为例
- 设计模式(十四)Singleton
- 2017-07-10(JS)
- 选择框的样式,
- 【CJOJ1494】【洛谷2756】飞行员配对方案问题
- BS4模块爬取第一财经练手
- JZOJ 7.9 B组第二题 blockenemy
- mongo数据库上传多媒体文件(视频/音频)文件问题
- JS中的!=、== 、!==、===的用法和区别
- Android 使用ViewFlipper实现图片切换