1、懒汉式(1)
class Singleton {
public:
static Singleton* getInstance() {
if (_instance == nullptr) {
_instance = new Singleton();
}
return _instance;
}
private:
static Singleton* _instance;
};
Singleton* Singleton::_instance = nullptr;
- 懒加载,在需要的时候创建实例
- 线程不安全,当A线程创建实例时,恰好B线程也在执行当前代码,A线程和B线程都会创建一份实例
2、懒汉式(2)
class Singleton {
public:
static Singleton* getInstance() {
lock_guard<mutex> lock(_mutex);
if (_instance == nullptr) {
_instance = new Singleton();
}
return _instance;
}
private:
static Singleton* _instance;
static mutex _mutex;
};
Singleton* Singleton::_instance = nullptr;
mutex Singleton::_mutex;
3、饿汉式
class Singleton {
public:
static Singleton* getInstance() {
return _instance;
}
private:
static Singleton* _instance = new Singleton();
};
- 编写简单,执行效率高,线程安全
- 无论是否使用,都会创建实例,会浪费资源
4、Meyers' Singleton(现在代码里面使用的)
class Singleton {
public:
Singleton(const Singleton &) = delete;
Singleton& operator=(const Singleton &) = delete;
static Singleton& getInstance() {
// 静态局部变量
static Singleton instance;
return instance;
}
private:
Singleton() {}
};
- 静态局部变量只会在第一次函数调用时初始化,后续再次调用不会初始化实例
- 懒加载,只有在使用到时,才会创建实例
- 返回引用可以防止指针被delete或者被置空