#include<iostream>
#include<mutex>
using namespace std;
/*单例模式:
* 1.恶汉式单例模式:还没有获取实例对象,实例对象就已经产生了.
* 2.懒汉式单例模式:唯一的实力对象,直到第一次获取他的时候,才产生.
*/
//一.懒汉式单例模式,优点是节省内存,缺点是线程不安全
class SingleExample
{
public:
static SingleExample* getinstance()//#3获取类的唯一实例对象的接口方法.
{
if (instance == nullptr)//如果实例为空,就创建第一个实例,否则返回原来的实例.
{
mutex1.lock();//星星星星星星星星星星星星星星星星
if (instance == nullptr)//加锁双重判断.保证一个实例对象,//星星星星星星星星星星星星星星星星
{
instance = new SingleExample();
//return instance;
}
mutex1.unlock();//星星星星星星星星星星星星星星星星
}
return instance;
}
private:
SingleExample() {}//#1构造函数私有化.
static mutex mutex1;//星星星星星星星星星星星星星星星星
static SingleExample* instance;//#2定义一个唯一的类的实例对象的指针.
SingleExample(const SingleExample&) = delete;//禁用拷贝构造
SingleExample& operator=(const SingleExample&) = delete;//禁用赋值重载
};
SingleExample* SingleExample::instance=nullptr;//静态成员变量.
mutex SingleExample::mutex1;//星星星星星星星星星星星星星星星星
int main()
{
SingleExample* p1 = SingleExample::getinstance();
SingleExample* p2 = SingleExample::getinstance();
SingleExample* p3 = SingleExample::getinstance();
cout << p1 << " " << p2 << " " << p3 << endl;
//SingleExample t1 = *p1;//(调用拷贝构造,所以要在代码中添加禁止拷贝函数)
// SingleExample t2;
return 0;
}
//二.饿汉式单例,线程是安全的.
#if 0
class SingleExample
{
public:
static SingleExample* getinstance()//#3获取类的唯一实例对象的接口方法.
{
return &instance;
}
private:
SingleExample(){}//#1构造函数私有化.
static SingleExample instance;//#2定义一个唯一的类的实例对象.
SingleExample(const SingleExample&) = delete;//禁用拷贝构造
SingleExample& operator=(const SingleExample&) = delete;//禁用赋值重载
};
SingleExample SingleExample:: instance;//静态成员变量.
int main()
{
SingleExample* p1 = SingleExample::getinstance();
SingleExample* p2 = SingleExample::getinstance();
SingleExample* p3 = SingleExample::getinstance();
cout << p1 << " " << p2 << " " << p3 << endl;
SingleExample t1 = *p1;//(调用拷贝构造,所以要在代码中添加禁止拷贝函数)
// SingleExample t2;
return 0;
}
#endif