把构造函数私有化,对外提供一个静态的成员函数获取对象实例,这是我们对单例模式的最简单印象,但是如果多线程同时获取对象实例的时候,我们首先想到的是加锁
class Singleton
{
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance();
};
Singleton* Singleton::getInstance()
{
if(NULL == m_instance)
{
Lock();
if(NULL == m_instance)
{
m_instance = new Singleton;
}
UnLock();
}
return m_instance;
}
加锁其实很影响效率,可以换个方式实现
class SingletonStatic
{
private:
static const SingletonStatic* m_instance;
SingletonStatic(){}
public:
static SingletonStatic* getInstance()
{
return m_instance;
}
};
//外部初始化
const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
利用全局变量在程序最开始就会被创建的原理,new SingletonStatic就会在多线程获取之前就被创建了。