阅读ISE源码过程中重新对单例模式的理解
程序员文章站
2024-03-25 09:27:46
...
0x01缘由
最近在项目开发中使用到了日志类,对其封装时采用的单例模式,但是仔细研究后,发现很多细节未考虑,于是学习了下ISE的单例模式设计;
0x02单例模式需考虑的场景
用于配置文件、日志等公共操作类。
注意如下:
1、每次instance()返回唯一个对象;
2、多线程并发访问;(意味着加锁)
3、返回对象效率要高;
0x03ISE单例实现
template<typename T>
class Singleton : boost::noncopyable
{
public:
static T& instance()
{
// DCL with volatile 双重锁检测
if (instance_ == NULL)
{
AutoLocker locker(mutex_); //加锁同步
if (instance_ == NULL)
instance_ = new T();
return *instance_;
}
return *instance_; //只在创建时考虑加锁,这样如果读出不为空直接返回,这样减少加锁的开销;
}
protected:
Singleton() {}
~Singleton() {}
private:
static T* volatile instance_;
static Mutex mutex_;
};
template<typename T> T* volatile Singleton<T>::instance_ = NULL;
template<typename T> Mutex Singleton<T>::mutex_;
0x04需要关注的技术点
A.DCL
双重锁检测;
B.volatile
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个
变量的时候,都会直接从变量地址中读取数据。
上一篇: uniapp与vue父子组件通信的对比
下一篇: 机器视觉专栏(一)opencv基础操作
推荐阅读