一、单例是什么
全局有且只有一个类的static实例。
二、c++实现单例
2.1 一个好的单例应该具备下面4点
- 全局只有一个实例:static特性,同时禁止用户自己声明并定义实例(把构造函数设为private)
- 线程安全
- 禁止拷贝和赋值
- 用户通过接口获取实例:使用static类成员函数
2.2最推荐的懒汉式单例-局部静态变量
如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。并发线程在获取静态变量的时候一定是初始化过的,具有线程安全性。
c++静态变量的生存期是从声明到程序结束,懒汉式。
cpp
#include <iostream>
using namespace std;
class SingletonPattern_V3
{
public:
~SingletonPattern_V3() {
std::cout << "destructor called!" << std::endl;
}
//禁止赋值和拷贝
SingletonPattern_V3(const SingletonPattern_V3&) = delete;
SingletonPattern_V3& operator=(const SingletonPattern_V3&) = delete;
//用户通过接口获取实例:使用static类成员函数
static SingletonPattern_V3& Instance() {
//局部静态变量特性,保证线程安全,全局只有一个实例
static SingletonPattern_V3 m_pInstance;
return m_pInstance;
}
private:
//禁止用户自己声明并定义实例(把构造函数设成private)
SingletonPattern_V3() {
std::cout << "constructor called!" << std::endl;
}
};
int main()
{
SingletonPattern_V3& instance_1 = SingletonPattern_V3::Instance();
SingletonPattern_V3& instance_2 = SingletonPattern_V3::Instance();
system("pause");
return 0;
}