0
点赞
收藏
分享

微信扫一扫

恶汉式单例模式,懒汉式单例模式(线程安全版)

#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

举报

相关推荐

0 条评论