懒汉式单例模式:不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化。
饿汉式单例模式:单例模式定义的时候就开始初始化。
1.加锁的懒汉式(线程安全)
#include<mutex>
class Singleton{
private:
//构造函数私有
Singleton(){
}
~Singleton(){}
//阻止拷贝
Singleton(const Singleton& rhs);
Singleton& operator=(const Singleton&rhs);
//指向实例的指针
static Singleton *pInstance;
//用于线程安全的锁
static std::mutex Mutex;
public:
//产生实例
static Singleton* getInstance();
};
std::mutex Singleton::Mutex;
Singleton* Singleton::pInstance=nullptr;//初始化时,置为空
Singleton* Singleton::getInstance(){
if(pInstance==nullptr){//注意,出错两次检查指针是否为空
//加锁
Mutex.lock();
if(pInstance==nullptr)
pInstance=new Singleton();
//解锁
Mutex.unlock();
}
return pInstance;
}
2.饿汉式
注意:单例的饿汉实现是线程安全的,因为对象在使用前就已经创建出来了。
class Singleton{
private:
//构造函数私有
Singleton(){
}
~Singleton(){}
//阻止拷贝
Singleton(const Singleton& rhs);
Singleton& operator=(const Singleton&rhs);
//指向实例的指针
static Singleton *pInstance;
public:
//产生实例
static Singleton* getInstance();
};
Singleton* Singleton::pInstance=new Singleton();//注意,在一开始时,就初始化指向示例的指针
Singleton* Singleton::getInstance(){
//直接返回指向实例的指针
return pInstance;
}