当前位置: 首页 > news >正文

单例模式(懒汉模式,饿汉模式)

单例的饿汉模式:在主函数未调用之前该单例就已经存在了,所以不存在线程安全的问题。

class Singleton
{
private: Singleton(){}
public:static Singleton  s1;static Singleton* GetInstance(){return &s1;}Singleton(const Singleton&) = delete;Singleton& operator= (const Singleton &) = delete;
};
int main()
{Singleton* p = Singleton::GetInstance();return 0;
}//为调用主函数前就已经创建了该对象,单例模式多用于日志模块或者数据库模块,饿汉式是线程安全的。

 线程安全的懒汉单例模式:懒汉单例模式是在调用函数的时候生成的,为了防止同一个线程调用需要加上互斥锁。同时减小锁的粒度,采用锁+双重判断的方式

std::mutex mx;
class Singleton
{
private: Singleton() {}
public:static Singleton*  volatile s1;static Singleton* GetInstance(){if (s1 == nullptr){std::lock_guard<std::mutex>lock(mx);   //锁+双重判断  线程安全的懒汉式单例模式最安全的if(s1 == nullptr)s1 = new Singleton();}return s1;}Singleton(const Singleton&) = delete;Singleton& operator= (const Singleton&) = delete;
};
Singleton* volatile  Singleton::s1 = nullptr;   //CPU为了提高效率会进行该内容的拷贝给每个线程,加上这个之后将不会再进行拷贝而使每个线程可以察觉到

 极为简洁的懒汉单例模式:在局部的静态变量中默认存在着互斥锁,本身不存在线程安全问题,所以在局部变量的情况下不需要维护线程安全问题。

//非常精简的懒汉单例模式,静态成员局部变量本身就是线程安全的问题。
class Singleton
{
private: Singleton() {}
public:static Singleton* GetInstance(){static Singleton  s1;return &s1;}Singleton(const Singleton&) = delete;Singleton& operator= (const Singleton&) = delete;
};

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PostgreSQL 触发器
  • uniapp h5本地预览pdf教程 (含白屏|跨域解决方案)
  • C++ primer plus 第17 章 输入、输出和文件:文件输入和输出03:文件模式:二进制文件
  • 图解大顶堆的构建、排序过程
  • 猫头虎 分享已解决Bug || 504 Gateway Timeout 解决方案
  • 手绘图系列 06 | 您一上Google就能接触到的Tries
  • FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕代码)
  • ArcGIS Pro 3.1学习之旅 ----day01 Arcgis pro安装
  • 苍穹外卖day12(day15)---数据统计——Excel报表(项目完结)
  • 使用FFmpeg实现摄像头RTMP实时推流
  • clickhouse安装部署问题求大佬看看
  • 科技云报道:“大模型+机器人”,具身智能将开启“智械时代”
  • 萌啦数据软件价格多少,萌啦数据软件价格是多少
  • Web 安全之 RCE(Remote Code Execution)攻击详解
  • LVS 负载均衡
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2019.2.20 c++ 知识梳理
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Hibernate最全面试题
  • Python3爬取英雄联盟英雄皮肤大图
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Windows Containers 大冒险: 容器网络
  • Zsh 开发指南(第十四篇 文件读写)
  • 浮现式设计
  • 坑!为什么View.startAnimation不起作用?
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用 Docker 部署 Spring Boot项目
  • 我感觉这是史上最牛的防sql注入方法类
  • 我有几个粽子,和一个故事
  • 我与Jetbrains的这些年
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 自制字幕遮挡器
  • hi-nginx-1.3.4编译安装
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ‌移动管家手机智能控制汽车系统
  • #Lua:Lua调用C++生成的DLL库
  • #QT(智能家居界面-界面切换)
  • #QT项目实战(天气预报)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (k8s)Kubernetes本地存储接入
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (solr系列:一)使用tomcat部署solr服务
  • (void) (_x == _y)的作用
  • (不用互三)AI绘画工具应该如何选择
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (自用)仿写程序
  • ***测试-HTTP方法