单件模式的特点很鲜明,确保在整个系统中只能实例化一个对象,并提供全局访问点。并且在下面的写法(1)和(3)中是在使用的时候才去创建对象,“延时实例化”,对于很占内存的对象来讲是有利的。当然在使用它的时候要考虑多线程的问题。
总结起来有三种写法:
(1)加锁,因为加了lock,只能有一个线程获取到这个lock,其他的线程只能等待。所以在对性能要求不高的时候可以使用。
class Singleton
{
private:
static Singleton *uniqueSingleton;
public:
static Singleton GetInstance()
{
Lock lock;
if(uniqueSingleton == NULL)
uniqueSingleton = new Singleton();
return uniqueSingleton;
}
};
(2)在初始化对象时,先创建singleton对象。这样就避免了多线程带来的问题。只是不能延时创建对象。
class Singleton
{
private:
static Singleton *uniqueSingleton = new Singleton();
public:
static Singleton GetInstance()
{
return uniqueSingleton;
}
};
(3)双检查锁+volatile, 注意要防止双检查锁失效
class Singleton
{
private:
static volatile Singleton *uniqueSingleton;
public:
static Singleton GetInstance()
{
if(uniqueSingleton == NULL)
{
Lock lock;
if(uniqueSingleton == NULL)
uniqueSingleton = new Singleton();
}
return uniqueSingleton;
}
};
参考文献: