设计模式——单例模式

什么是单例模式

一个类只能创建一个对象,即单例模式,该模式下可保证系统中该类只有一个实例,并提供一个访问它的全局接口,该实例被所有程序模块共享。

单例模式有两种实例情况

  • 饿汉模式:程序启动就创建一个唯一的实例对象
  • 懒汉模式:调佣全局接口的时候创建唯一的实例。

饿汉模式

cpp 复制代码
class Singleton
{
public:
	static Singleton* GetInstance()
	{
		return _ins;
	}

	void Add(const string& str)
	{
		_mtx.lock();

		_v.push_back(str);

		_mtx.unlock();
	}

	void Print()
	{
		_mtx.lock();

		for (auto& e : _v)
		{
			cout << e << endl;
		}
		cout << endl;

		_mtx.unlock();
	}

private:
	//限制类外随意创建对象
	Singleton()
	{

	}

private:
	int _n;
	vector<string> _v;
	mutex _mtx;

	static Singleton* _ins;
};

Singleton* Singleton::_ins = new Singleton;

但是饿汉有一个问题:如果单例对象十分耗时或者占用很多资源,比如加载插件,初始化网络连接,也有可能在程序一开始用不到,那么在程序一开始创建就会导致程序启动很慢,所以有了懒汉模式。

懒汉模式

cpp 复制代码
class Singleton
{
public:
	static Singleton* GetInstance()
	{
		//双检查加锁
		if (_ins == nullptr) //提高效率,不需要每次加锁和解锁 
		{
			_imtx.lock();
			
			if (_ins == nullptr) //保证线程安全,只用new一次
			{
				_ins = new Singleton;
			}

			_imtx.unlock();
		}

		return _ins;
	}

	void Add(const string& str)
	{
		_vmtx.lock();

		_v.push_back(str);

		_vmtx.unlock();
	}

	void Print()
	{
		_vmtx.lock();

		for (auto& e : _v)
		{
			cout << e << endl;
		}
		cout << endl;

		_vmtx.unlock();
	}

private:
	//限制类外随意创建对象
	Singleton()
	{

	}

private:
	int _n;
	vector<string> _v;
	mutex _vmtx;

	static mutex _imtx;
	static Singleton* _ins;
};
 
Singleton* Singleton::_ins = nullptr;
mutex Singleton::_imtx;

这里注意一下,创建实例的时候要用双重加锁,因为在多线程的场景下,就去一直加锁判断,要知道锁的消耗是很大的,所以双重检查是很重要的。

懒汉模式的优点:

  • 第一次使用的时候创建实例对象
  • 如果多个单例对象有启动顺序要求的话,也可以控制(这点饿汉模式就无法控制了)

懒汉模式的缺点

  • 复杂
相关推荐
王维同学11 分钟前
IFEO Debugger、VerifierDlls 与 SilentProcessExit 配置
c++·windows·安全·注册表
geovindu25 分钟前
CSharp: Iterative Algorithms
开发语言·后端·算法·c#·.net·迭代算法
小保CPP27 分钟前
OpenCV C++计算多边形的最大内切圆
c++·人工智能·opencv·计算机视觉
一只月月鸟呀40 分钟前
移动端tap与click的区别 && 点透事件
开发语言·前端·javascript
雨落在了我的手上41 分钟前
Java数据结构(六):链表的介绍
java·开发语言·数据结构
影寂ldy43 分钟前
C# HttpClient 分片下载、断点续传、暂停取消(完整项目知识点)
开发语言·c#
独隅1 小时前
DevEco Code Plan+Build 双 Agent 协同开发效率实测
java·开发语言
lueluelue472 小时前
八股临时总结
c++
KaMeidebaby2 小时前
卡梅德生物技术快报|抗体筛选:抗体筛选中的噬菌体展示四参数调优——从流程设计到数据验证
开发语言·前端·javascript
大黄说说2 小时前
接口频繁超时、报错?后端常见排查思路总结
开发语言·php