最简单的单根模式的实现:
//only suit for single-thread mode
class Singleton
{
public:
static Singleton& Instance()
{
static Singleton theSingleton;
return theSingleton;
}
/* more (non-static) functions here */
private:
Singleton();
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
~Singleton();
};
在Singleton & Instance()函数的实现中加入一个全局的静态locker可以实现线程安全的singleton.
class Singleton
{
public:
static Singleton& Instance()
{
//try to locker
//some_locker.lock();
static Singleton theSingleton;
return theSingleton;
}
/* more (non-static) functions here */
private:
Singleton();
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
~Singleton();
//static locker some_locker;
};
为了避免每次都调用locker,可以使用double checker的机制来改善。
关于double checker参见如下做法:
T* T::instance()
{ if (smInstance == NULL) { VMutexLocker lock(&smMutex); if (smInstance == NULL) // double-check smInstance = new T(); } return smInstance; }
注:为了避免内存泄漏,我们在实际中用了静态变量的引用的实现来实做singleton,而没有使用指针的实现。