有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。
单例大约有两种实现方法:懒汉与饿汉。
懒汉:在第一次用到类实例的时候才会去实例化;
饿汉:在单例类定义的时候就进行实例化。
特点与选择:
由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。
在访问量较小时,采用懒汉实现。
1、最常见的单例写法
class Singleton
{
public:
static Singleton *getInstance();
private:
Singleton();
Singleton(const Singleton &obj) = delete; //明确拒绝
Singleton &operator=(const Singleton &obj) = delete; //明确拒绝
static std::mutex _mutex;
static Singleton *_sglton; //(此处也可直接写为静态变量)
};
Singleton *Singleton::_sglton = nullptr; //饿汉式:=new Singleton();
std::mutex Singleton::_mutex;
Singleton *Singleton::getInstance()
{
if (_sglton == nullptr)
{
std::lock_guard<std::mutex> ll(_mutex);
if (_sglton == nullptr)
{
_sglton = new Singleton;
}
}
return _sglton;
}
2、静态局部变量的写法
class Singleton
{
public:
static Singleton &getInstance();
private:
Singleton();
Singleton(const Singleton &);
Singleton &operator=(const Singleton &);
};
Singleton &Singleton::getInstance()
{
static Singleton siglton;
return siglton;
}