(1)局部静态变量(函数的局部静态变量生命周期在进程结束时结束)
//饿汉式方式1
class Single
{
private:
Single (){}
public:
static Single& get()
{
static Single instance;
return instance;
}
};
(2)指针方式(在堆上创建生命周期在进程结束时结束或者Delete)
//懒汉式
class Single
{
private:
Single (){}
static Single* instance;
public:
static Single* get()
{
if (instance == null) {
instance = new Single();
}
return instance;
}
}
//饿汉式方式2
class Single
{
private:
Single (){}
static Single* instance;
public:
static Single* get()
{
return instance;
}
}
//类外定义,main开始执行前,该对象被创建
Single* Single::instance = new Single();
上述两种单例模式实现方式是非线程安全,会在不同线程中创建出不同的对象。
(3)线程安全的单例模式(直接加上互斥锁)
class Single
{
private:
Single (){}
static Single* instance;
static mutex m_mutex;
public:
static Single* get()
{
if (instance == null)
m_mutex.lock();
if (instance == null) {
instance = new Single();
}
m_mutex.ulock();
return instance;
}
}