class sington
{
private:
sington();
static sington* m_pInstance;
public:
static sington* GetInstance()
{
if(NULL == m_pInstance)
{
Lock();
if(NULL == m_pInstance)
m_pInstance = new sington();
UnLock();
}
return m_pInstance;
}
}
单例类Sington有以下特征:
·它有一个指唯一实例的静态指针m_pInstance,并且是私有的。
·它有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例。
·它的构造函数是私有的,这样就不能从别处创建该类的实例。
为什么要double check null?
因为两个线程可能都在第一次check的时候检测到NULL == m_pInstance,这样尽管lock了,仍然会new出两个对象。
为什么不在第一次check的时候lock?
因为这样会降低效率,其实在后面上锁只要检测一次,以后都不用了,因为此时m_pInstance已经创建出来了。