1、懶漢式(1)
class Singleton {
public:
static Singleton* getInstance() {
if (_instance == nullptr) {
_instance = new Singleton();
}
return _instance;
}
private:
static Singleton* _instance;
};
Singleton* Singleton::_instance = nullptr;
- 懶加載,在需要的時(shí)候創(chuàng)建實(shí)例
- 線程不安全,當(dāng)A線程創(chuàng)建實(shí)例時(shí),恰好B線程也在執(zhí)行當(dāng)前代碼,A線程和B線程都會(huì)創(chuàng)建一份實(shí)例
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();
};
- 編寫簡(jiǎn)單,執(zhí)行效率高,線程安全
- 無(wú)論是否使用,都會(huì)創(chuàng)建實(shí)例,會(huì)浪費(fèi)資源
4、Meyers' Singleton(現(xiàn)在代碼里面使用的)
class Singleton {
public:
Singleton(const Singleton &) = delete;
Singleton& operator=(const Singleton &) = delete;
static Singleton& getInstance() {
// 靜態(tài)局部變量
static Singleton instance;
return instance;
}
private:
Singleton() {}
};
- 靜態(tài)局部變量只會(huì)在第一次函數(shù)調(diào)用時(shí)初始化,后續(xù)再次調(diào)用不會(huì)初始化實(shí)例
- 懶加載,只有在使用到時(shí),才會(huì)創(chuàng)建實(shí)例
- 返回引用可以防止指針被delete或者被置空