sunwengang blog

C++ 单例模式

字数统计: 265阅读时长: 1 min
2019/10/20 Share

懒汉式单例模式

缺点是延迟加载,比如配置文件,只有在使用的时候才会加载。

1
2
3
4
5
6
7
8
9
10
11
12
13
class CSingleton {
public:
static CSingleton GetInstance() {
if (m_pInstance == NULL)
m_pInstance = new CSingleton();
reutrn m_pInstance;
}

private:
CSingleton() {};

static CSingleton * m_pInstace;
}

多线程下的懒汉模式

使用double-check来保证线程安全。但是如果处理大量数据时,该锁才成为严重的性能瓶颈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Singleton  
{
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance();
};

Singleton* Singleton::getInstance()
{
if(NULL == m_instance)
{
Lock(); //借用其它类来实现,如boost
if(NULL == m_instance)
{
m_instance = new Singleton;
}
UnLock();
}
return m_instance;
}

饿汉式单例模式

一开始就创建实例对象并且加载,每次使用的时候直接返回就好了。
饿汉式会出现线程安全问题,在多线程下,或个线程都初始化一个单例,得到的指针并不是指向同一个地方,就不满足单例类的定义,此时就需要进行修改。

1
2
3
4
5
6
7
8
9
10
class CSingletonB {
private:
CSingletonB () {}

public:
static CSingletonB * GetInstance() {
static CSingleton instance;
return &instance;
}
}
CATALOG
  1. 1. 懒汉式单例模式
    1. 1.1. 多线程下的懒汉模式
  2. 2. 饿汉式单例模式