线程安全的singleton
来源:互联网 发布:js 数组相加 编辑:程序博客网 时间:2024/04/19 05:56
以前面试的时候经常被问到singleton, 以前不明觉厉, 觉得不太理解singleton 的重要性。工作中,却发现singleton这个设计模式,在工程中广泛应用。
下面给出两种singleton 模式
一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.
使用double-check来保证thread safety但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
1、静态成员实例的懒汉模式:
class Singleton { private: static Singleton* m_instance; Singleton(){} public: static Singleton* getInstance(); }; Singleton* Singleton::getInstance() { if(NULL == m_instance) { Lock();//借用其它类来实现,如boost if(NULL == m_instance) { m_instance = new Singleton; } UnLock(); } return m_instance; }
二、饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。
由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。
故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
class SingletonStatic { private: static const SingletonStatic* m_instance; SingletonStatic(){} public: static const SingletonStatic* getInstance() { return m_instance; } }; //外部初始化 before invoke main const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic();
下面给出一个完整的double check 方法的线程安全的singleton模版类
template<typename T>class Singleton(){ NOCOPY_CLASS(singleton); public: static T& GetInstance() { if(instance_ == NULL) { lock_.Lock(); if(instance_ == NULL) { intstance_ = new T; } lock_.Unlock(); } return *instance_; } protected: Singleton(); ~Singleton(); private: static T* volatile instance_; static MutexLock lock_;};template<typename T>T * volatile Singleton<T>::instance_ = NULL;template<typename T>MutexLock Singleton<T>::lock_;
0 0
- singleton 线程安全的singleton
- 线程安全的singleton
- 线程安全的singleton
- 线程安全的singleton
- 线程安全的singleton实例
- 线程安全的C++的Singleton实现
- Reproduced:线程安全的 Singleton - Visual Basic
- 编写线程安全的单件(Singleton)
- c# SingleTon的线程安全(存档)
- python 线程安全的单例 singleton
- ace allocator 和 singleton 的线程安全
- C++实现线程安全的Singleton
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- 线程安全的 C++ Singleton 实现
- C语言实现MD5/SHA1/SHA256/SHA512
- ListView不能响应itemclick事件的解决方法
- 最大流,最小割(水塘,uva 1515)
- scala基础33-List基础
- Matlab|语音处理|voicebox的下载和添加
- 线程安全的singleton
- Windows下Python、Pydev、easy_install、pip、Numpy、Scipy安装
- 多线程编程入门(10):线程池
- inline内联函数不能为virtual虚函数的原因
- C++ 基于类的n皇后问题
- (Java)LeetCode-31. Next Permutation
- 未来半年的学习规划
- scala基础34-List常用函数
- 求知之路之微信订阅号