设计模式——单例模式

什么是单例模式

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

单例模式有两种实例情况

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

饿汉模式

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;

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

懒汉模式的优点:

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

懒汉模式的缺点

  • 复杂
相关推荐
MarkHD8 分钟前
车辆TBOX科普 第56次 从模块拼接到可靠交付的实战指南
java·开发语言
谷粒.13 分钟前
DevOps流水线中的质量门禁设计:从理论到实践的全景解析
运维·开发语言·网络·人工智能·python·devops
李日灐13 分钟前
C++STL: list(双链表) 简单介绍,了解迭代器类型,list sort 的弊端
开发语言·c++·list
打不了嗝 ᥬ᭄19 分钟前
【Linux】多路转接 Select , Poll和Epoll
linux·网络·c++·网络协议·http
掘金-我是哪吒26 分钟前
第378集设备服务接入系统Java微服务后端架构实战
java·开发语言·spring·微服务·架构
啊森要自信31 分钟前
【C++的奇迹之旅】map与set应用
c语言·开发语言·c++
一颗宁檬不酸31 分钟前
Java Web 踩坑实录:JSTL 标签库 URI 解析失败(HTTP 500 错误)完美解决
java·开发语言·前端
有一个好名字36 分钟前
Java 高性能序列化框架 Kryo 详解:从入门到实战
java·开发语言
酒尘&37 分钟前
JavaScript官网Promise篇
开发语言·前端·javascript·前端框架·交互
pu_taoc40 分钟前
ffmpeg实战4-将PCM与YUV封装成MP4
c++·ffmpeg·pcm