设计模式之单例模式

设计模式C++实现(4)——单例模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。单例模式 阅读详情

动机

在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们逻辑正确性和良好的效率。
思考:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

头文件:

#include <iostream>
#include <mutex>
#include <atomic>

class Singleton
{
private:
	Singleton();
	Singleton(const Singleton& other);

public:
	static Singleton* getInstance();
	static Singleton* m_Instance;
};

实现文件:

#include "Singleton.h"
Singleton* Singleton::m_Instance = nullptr;

//V1
Singleton* Singleton::getInstance()
{
	if (m_Instance == nullptr)
	{
		m_Instance = new Singleton();
	}
	return m_Instance;
}

//V2
Singleton* Singleton::getInstance()
{
	m_mutex.lock();
	if (m_Instance == nullptr)
	{
		m_Instance = new Singleton();
	}
	m_mutex.unlock();
	return m_Instance;
}

//V3
Singleton* Singleton::getInstance()
{
	if (m_Instance == nullptr)
	{
		m_mutex.lock();
		if (m_Instance == nullptr)
		{
			m_Instance = new Singleton();
		}
		m_mutex.unlock();
	}
	return m_Instance;
}

上述代码讲到了三种构造函数实现的方式,以上三种方式皆存在部分问题,问题分别如下:

  1. V1版本:
    线程非安全版本,意思是当存在多个线程同时访问的话,无法保证该对象实例仅产生一个,当有2个线程threadA和threadB同时执行到if判断代码,皆因为当前是nullptr而进入new的逻辑,此时就可能产生多个对象实例,如果仅在单线程环境下则无问题。

  2. V2版本:
    线程安全版本,但锁的代价较高,意思是该方法能够保证只产生一个对象实例,但是当对象实例已经存在的时候,后续执行仅是读取操作依然会先上锁,这种锁其实是多余没必要的。

  3. V3版本:
    双检查锁,但由于内存读写reorder仍存在问题,从代码上看先判断当前是否存在对象实例,有则返回,没有再上锁进行第二次判断,这里第二次判断不能省略,因为在多线程情况下,比如threadA和threadB同时执行到第一个if判断里,threadA获得了锁,当threadA创建实例结束解开锁时,threadB也依然会额外创建实例,所以这里的第二个判断不能省。
    但这种情况后来经大佬指出会存在内存读写reorder问题,会导致双检查锁的失效,正常流程是先分配内存,再通过构造对这片内存初始化,之后再把这片内存地址返回出去。但经过reorder后可能会出现分配内存后直接返回内存地址的情况,跳过了中间构造环节,这样threadB进入后判断当前不是nullptr就直接返回了,但此时获取到的地址是不能使用的。

推荐用法:

std::atomic<Singleton*> Singleton::m_Instance;
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance()
{
	Singleton* tmp = m_Instance.load(memory_order_relaxed);
	std::_Atomic_thread_fence(std::memory_order_acquire);
	if (tmp == nullptr)
	{
		std::lock_guard<std::mutex> lock(m_mutex);
		tmp = m_Instance.load(memory_order_relaxed);
		if (tmp == nullptr)
		{
			tmp = new Singleton();
			std::_Atomic_thread_fence(std::memory_order_release);
			m_Instance.store(tmp, std::memory_order_relaxed);
		}
	}
	return tmp;
}
java设计模式之单例模式——Singleton pattern 设计模式故事会:https://blog.youkuaiyun.com/weixin_40205234/article/details/90664824 单例模式 单例模式(Singleton pattern)是java中最常见的设计模式之一。该模式属于创建型设计模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一... 阅读详情

相关推荐

图像修复黑科技:对比BM3D/DnCNN等5种去噪器在PNP框架中的实战效果

本文深度评测了BM3D、DnCNN等五款主流去噪器在即插即用(PnP)优化框架中的实战表现。通过量化指标、视觉对比及超分等泛化任务测试,揭示了深度学习模型在性能与收敛速度上的优势,并为不同应用场景提供了选型指南与工程化建议。

weixin_29065959的博客 366

设计模式-单例模式(Singleton Pattern)

单例模式 定义 确保一个类只有一个实例,并为整个系统提供一个全局访问点 (向整个系统提供这个实例)。 类型 创建型。 适用场景 网站访问量计数器。 项目中用于读取配置文件的类。 Spring中,每个Bean默认都是单例的,这样便于Spring容器进行管理。 优点 由于单例模式只生成了一个实例,所以能够节约系统资源、减少性能开销、提高系统效率。 缺点 不适合用于变化频繁的对象;如果实例化的对象长...

kaven 5158

保姆级教程:用STM32H743+TJA1042T玩转FDCAN,CubeMX配置1M/5M双速率通信(附完整代码)

本文提供STM32H743与TJA1042T实现FDCAN双速率通信的保姆级教程,详细讲解CubeMX配置1M/5M双速率通信的全过程,包括硬件连接、时钟树配置、过滤器设置及中断管理,并附完整代码示例,助力开发者快速掌握FDCAN高速通信技术。

weixin_30698297的博客 473

23种设计模式中的单例模式(Singleton Pattern)

本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

RISC-V V向量指令集学习笔记——访存指令

RISC-V V向量指令集学习笔记——访存指令

qq_41724469的博客 5132

MuJoCo新手必看:5分钟搞定你的第一个机器人仿真(附Python代码)

本文为零基础新手提供了一份详尽的MuJoCo物理仿真引擎入门指南。从环境搭建、MJCF模型文件解析,到编写Python控制代码,手把手教你5分钟内创建并运行第一个机器人仿真。内容涵盖双摆模型控制与自定义四轮小车构建,帮助你快速掌握这一高性能开源工具,迈出机器人学与强化学习仿真的第一步。

weixin_29032489的博客 655

设计模式之单例模式(Singleton Pattern)

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:构造函数是私有的。

weixin_42294716的博客 1398

机器学习【学校智慧食堂及其应用】

本文主要介绍机器学习【智慧食堂及其应用】

qq_201729558 2571

23种设计模式之单例模式(Singleton Pattern)【设计模式】

📒单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式主要用于控制资源的访问,确保某些类只有一个实例,并且这个实例能够被全局访问。

李赛赛的专栏 1101

突破边缘AI算力瓶颈:YOLOv12模型剪枝与知识蒸馏联合优化全攻略

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

m0_71589036的博客 219

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2772

设计模式:单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是一种创建型设计模式,它的核心思想是:保证在一个进程中,某个类仅有一个实例,并提供全局访问点。

TechNomad的博客 1456

DeepSeek如何构建可扩展的 AI 驱动交易系统,基于 MetaTrader 5 与 Python 利用先进的数据处理、机器学习和容器化部署来优化算法交易。

MT5 Python API 架构设计分为三层:通信层:利用异步消息传递(例如 ZeroMQ 或标准套接字编程)支持每秒数万个数据请求。转换层: C++ 动态库有效地将 MT5 命令转换为 Python 对象(反之亦然),从而优化速度和内存使用率。接口层:提供Pythonic API,封装了所有终端功能,包括:1)实时价格订阅(滴答或秒级更新)2)历史数据检索(从M1到更高的时间范围)3)订单流监控(交易详情和市场深度)4)策略执行引擎(用于算法交易)

iCloudEnd的博客 1379

设计模式——单例模式(Singleton Pattern)

设计模式——单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在有些场景中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,且该类能自行创建这个实例,这就是所谓的单例模式 文章目录设计模式——单例模式(Singleton Pattern)单例模式的优缺点优点缺点单例模式的应用场景单例模式与静态类的区别常见的7种实现方式1.饿汉模式2.懒

qq_42498542的博客 833

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

实践GoF设计模式:Singleton Pattern 单例模式

前言 我们在开发项目中,经常会遇到这种情况,为了节约所拥有的系统资源或数据的一致性时,需要保证系统中的某个类中有且只有唯一的一个实例,而且在其创建成功之后,我们将不能再次创建同类型的其他对象,也就是所有的操作都要以这个唯一的实例为中心,所以为了保证对象所具有的的唯一性,单例模式成为我们所具备的方法 概念 ● 设计模式中单例模式是最为简单的形式之一,而且是使用最广泛的设计模式之一,其目的是为了将类的一个对象成为系统中的唯一实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享 ● 要想实现这一点,可以

m0_70748458的博客 402

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

设计模式总结之Singleton Pattern(单例模式)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

cooldragon的专栏 4858

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

golang mysql单例模式_GoLang 设计模式之单例模式 (Singleton Pattern)

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设 计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。???? 单例模式 (Singleton Pattern)现实世界的例子:一次只能有一个国家的总统。简单来说:确保只创建特定类的一个对象。单例模式实际上被认为是反模式,应该避免过度使用它。它不...

weixin_39924573的博客 281

设计模式之单例模式(Singleton pattern)

单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 看代码: 1 namespace SingletonPattern 2 { 3 public class Singleton 4 { ...

144

设计模式——单例模式(Singleton Pattern)+ Spring相关源码

确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。避免一个全局使用的类频繁地创建与销毁。

码鹿的记录 367

【Java设计模式】之 单例模式(Singleton Pattern)模式 饿汉式单例模式 vs 懒汉式单例模式

什么是设计模式? 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模免去我们自己再思考和摸索,设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,"套路”。 设计模式的分类: ① 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 ② 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ③ 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、

weixin_46081857的博客 418

JavaScript 设计模式之-单例模式(Singleton Pattern)

面试了很多简历写着前端5,6年高级前端工程师,大部分设计模式都说不明白,其实不要把设计模式想的很难,其实是一种思想,我一起搞iOS,也搞前端,设计模式原理都是一样的,写法就不差不多,只要搞清楚他的概念和使用场景就理解很容易 什么是单例模式? 规定一个类只有一个实例,并且提供可全局访问点; 单例模式的有哪些使用场景? 就APP 开发来说,单例模式还是比较常用的,比如弹窗组件,通过全局单例维护相关状态,如果每次创建一个新的对象,有些场景会多个弹窗叠加。 还有定位,或者网络请求,都是使用单例进行封装的。 例如.

冷胜任 的专栏 526

设计模式---单例模式(DesignPattern_Singleton)

DesignPattern_AbstractFactory 摘录自:设计模式与游戏完美开发 工程GitHub SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Singleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事) 单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例...

su9257的博客 145
上一篇: Window平台编译log4cpp使用方法记录 (二)
下一篇: 记录VS中项目输出目录设置方法
照书抄代码
博客等级 码龄8年 32粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值