#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "MultiThread.h"
class singleton
{
public:
~singleton()
{
}
static singleton* getInstance()
{
MutexLockGuard lock(mutex_);
if(NULL == instance_)
{
instance_ = new singleton();
}
return instance_;
}
private:
singleton()
{
}
static singleton* instance_;
Mutex mutex_;
};
singleton* singleton::instance_ = NULL;
#endif //_SINGLETON_H_
上面解法不是很完美,每次getInstance都会加锁,二加锁是一个非常耗时的操作,在没有必要时应尽量避免。
我们只是在实例还没有创建之前需要加锁操作,以保证只有一个线程创建出实例。而当实例已经创建成功,我们已经
不需要再做加锁操作了,读是线程安全的。上述代码修改如下:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "MultiThread.h"
class singleton
{
public:
~singleton()
{
}
static singleton* getInstance()
{
if(NULL == instance_)
{
MutexLockGuard lock(mutex_);//作用域为临界区
if(NULL == instance_)
{
instance_ = new singleton();
}
}
return instance_;
}
private:
singleton()
{
}
static singleton* instance_;
Mutex mutex_;
};
singleton* singleton::instance_ = NULL;
#endif //_SINGLETON_H_