众多设计模式中,单例模式比较常见的一种,面试和工作中也会经常接触到。本文以一个C++开发者的角度来探讨单例模式几种典型实现。设计模式经典GoF定义的单例模式需要满足以下两个条件:
1. 保证一个类只创建一个实例。
2. 提供对该实例的全局访问点。
如果系统有类似的实体(有且只有一个,且需要全局访问),那么就可以将其实现为一个单例。实际工作中常见的应用举例
- 日志类,一个应用往往只对应一个日志实例。
- 配置类,应用的配置集中管理,并提供全局访问。
- 管理器,比如windows系统的任务管理器就是一个例子,总是只有一个管理器的实例。
- 共享资源类,加载资源需要较长时间,使用单例可以避免重复加载资源,并被多个地方共享访问。
class Singleton
{
public:
staticSingleton& GetInstance()
{
if(NULL== m_pInstance)
{
Locklock;//基于作用域的 加锁,超出作用域,自动调用析构函数解锁
if(NULL== m_pInstance)
{
m_pInstance= new Singleton;
}
}
return*m_pInstance;
}
private:
Singleton();
~Singleton();
Singleton(constSingleton&);
Singleton&operator = (const Singleton&);
private:
staticSingleton* m_pInstance;
};
Lazy Singleton的一种线程安全改造是在Instance()中每次判断是否为NULL前加锁,但是加锁是很慢的。
而实际上只有第一次实例创建的时候才需要加锁。双检测锁模式被提出来,改造之后大致是这样
既然只需要在第一次初始化的时候加锁,那么在这之前判断一下实例有没有被创建就可以了,所以多在加锁之前多加一层判断,需要判断两次所有叫Double-Checked。