设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)

单例模式

  • 引言
  • 正文
    • 1. 饿汉式单例
    • 2. 带双重检查锁定机制的懒汉式单例
    • 3. IoDH技术的单例
  • 结论
    • 优点
      • 饿汉式单例
      • 带双重检查锁定机制的懒汉式单例
      • IoDH技术的单例
    • 缺点
      • 饿汉式单例
      • 带双重检查锁定机制的懒汉式单例
      • IoDH技术的单例

引言

在软件开发中,单例模式是一种很常用的设计模式。它确保类只有一个实例,并提供全局访问点,以便在整个应用程序中共享这个实例。比如我们的日志系统、数据库连接池、线程池等等都会用到。
本文将讨论三种常见的单例模式实现方式,分别是饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例。通过这三种实现方式,可以更好地理解单例模式的概念和使用。

正文

1. 饿汉式单例

饿汉式单例是指在程序初始化阶段就创建出唯一的实例。它的特点是类在加载时就创建对象,所以不存在线程安全问题。以下是一个使用C++实现的饿汉式单例的示例代码

class Singleton {
private:static Singleton* instance;// 私有构造函数,防止外部实例化Singleton() {}public:static Singleton* getInstance() {return instance;}
};// 在类外初始化静态成员变量
Singleton* Singleton::instance = new Singleton();

2. 带双重检查锁定机制的懒汉式单例

懒汉式单例是指在需要使用实例时才进行创建。它的特点是在多线程环境下,需要进行双重检查锁定,以确保只有一个实例被创建。以下是一个使用C++实现的带双重检查锁定机制的懒汉式单例的示例代码

#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;// 私有构造函数,防止外部实例化Singleton() {}public:static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = new Singleton();}}return instance;}
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

3. IoDH技术的单例

IoDH(Initialization-on-Demand Holder)技术是一种结合了饿汉式和懒汉式单例的实现方式。它是利用了静态局部变量的特性,在需要时才创建实例,并且在多线程环境下也能确保线程安全。以下是一个使用C++实现的IoDH技术的单例的示例代码

class Singleton {
private:Singleton() {}public:static Singleton* getInstance() {static Singleton instance;return &instance;}
};

结论

优点

饿汉式单例

天然支持多线程。

带双重检查锁定机制的懒汉式单例

延迟创建,系统初始化时负荷小。

IoDH技术的单例

支持多线程,同时支持延迟创建。

缺点

饿汉式单例

①初始化负荷大。②资源浪费,可能场景为系统在启动很长时间内不适用该单例的实例对象,或者甚至在声明周期内不适用。③对于c++这种没有垃圾回收机制的语言还好,对于golang或者java这种有垃圾回收的语言,可能会存在单例一开始被创建好了,中途因为长时间不用,又被回收了,用的时候又会再次创建,导致反复的开销。

带双重检查锁定机制的懒汉式单例

每次获取单例对象都需要加锁,影响系统性能。比如系统系统打日志,每次都需要去获取获取锁,多线程之间就会有严重的竞争,导致性能下降。

IoDH技术的单例

无缺点,暂时是完美的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

划重点!2020年,这些前沿技术最受关注

来源&#xff1a;科技日报大热的脑机接口、基因编辑等前沿技术发展如何&#xff1f;2020年科技界关注了哪些热点&#xff1f;22日在浦江创新论坛上发布的《全球前沿技术发展趋势报告》带来了答案。《全球前沿技术发展趋势报告》由中国科学技术信息研究所和上海市科学学研究所联…

MVC里面写html获取不到input,asp.net-mvc – ASP.Net [HiddenInput]数据属性在Razor中用Html.EditorForModel渲染时不起作用?...

我有以下型号&#xff1a;public class Product{[HiddenInput(DisplayValue false)]public int ProductID { get; set; }[required(ErrorMessage"Please enter a product name")]public string Name { get; set; }[required(ErrorMessage"Please enter a descr…

select默认选中的option_macOS下妙用option按键

macOS下option键是非常重要的按键&#xff0c;它的特性是激活一些隐藏功能&#xff0c;所以经常被多数人忽视。现在总结一下option键让你意想不到的功能吧。最大化窗口mac左上角三个按钮默认为关闭 最小化和全屏&#xff0c;但大多数时候&#xff0c;我们最要的是最大化窗口&am…

化身“监工”的AI,我们该如何相处?

来源&#xff1a; 脑极体AI技术带来整体社会福利增加的同时&#xff0c;也正在带来一系列新的问题。目前来说&#xff0c;与人工智能是否会取代人类这类“玄学”问题而言&#xff0c;当下最现实的一个问题就是人和AI的协作问题了。不久前&#xff0c;人物杂志的一篇《外卖骑手&…

怎么判断一个字符串的最长回文子串是否在头尾_最长回文字串/子序列问题(leetcode5,9,519)

leetcode 5 最长回文子串给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1&#xff1a;输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例 2&#xff1a;输入: "cbbd" 输出…

html 点击div 改变高度,HTML / CSS将div设置为同级的高度

我有三分之二的div。所包含的div之一向左浮动&#xff0c;另一个向右浮动。我希望2个同级div始终处于相同的高度&#xff0c;但是对此存在问题。到目前为止&#xff0c;我只在Firefox中查看该页面&#xff0c;并认为在至少一个浏览器中运行它后&#xff0c;我会担心任何跨浏览器…

张亚勤:对于产业来讲,深度学习的黄金时代刚刚开始

大数据文摘出品由中国计算机学会(CCF)举办的计算领域年度盛会CNCC 2020今天在北京隆重开幕&#xff0c;大会主题是“信息技术助力社会治理”。大会设有14个特邀报告、3场大会论坛、百余场技术论坛以及CCF CTO峰会等多场活动&#xff0c;邀请到超过400位国内外计算机领域知名专家…

去月球“你知道戴维会变身成哪种动物吗?”

在《去月球》游戏中&#xff0c;有一节会遇到一个问题&#xff1a; “你知道戴维会变身成哪种动物吗&#xff1f;” &#xff08;请用英语大写字母回答&#xff09; 其实这个答案&#xff0c;和上面的回忆对话&#xff0c;就能知道了&#xff0c;看下图 答案就是&#xff1a;CO…

计算机组装与维修案例分析,设备故障维修案例分析三则

设备故障维修案例分析三则本文列举较具有代表性的故障维修的三个案例,以此阐述在医疗设备维修中对各方面知识综合运用的能力以及对设备故障诊断分析过(本文共2页)阅读全文>>针对通信设备故障维修领域知识表示规范性差、结构性不强、案例利用率低等问题,结合设备维修案例知…

erp实施 数据库面试题_ERP管理系统多少钱

ERP系统本质上是一套软件包&#xff0c;可以执行会计&#xff0c;产品计划和开发&#xff0c;制造&#xff0c;库存管理&#xff0c;销售管理&#xff0c;人力资源和其他业务任务。很多企业在选择ERP系统的时候都会比较关心费用的问题&#xff0c;其实ERP系统价格受很多方面因素…

web.xml配置解释

<?xml version"1.0" encoding"UTF-8"?><web-app version"3.1" xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org…

美军军事通信系统简史

来源&#xff1a;对讲机世界大家都知道&#xff0c;美军发明了互联网。但是&#xff0c;你也许不知道&#xff0c;今天的移动通信网络的前身正是美军的MSE (Mobile Subscriber Equipment&#xff0c;美军移动用户设备系统&#xff09;。80年代&#xff0c;美军开始寻找新的技术…

html四边形的的框怎么编写,html知识点之利用css四边形切角并且加上边框

html知识点之利用css四边形切角并且加上边框html知识点之利用css四边形切角并且加上边框前言这几个月做了很多前端工作&#xff0c;其中一个需求还是蛮头疼&#xff0c;UI给的图上面的四边形是一个带斜边的&#xff0c;直接用背景图可以实现&#xff0c;但是会出现各种布局的问…

java this关键字的使用_Java关键字(五)——this

大家好&#xff0c;我是可乐&#xff0c;一个专注原创&#xff0c;乐于分享的程序猿。 本系列教程持续更新&#xff0c;可以微信搜索「 IT可乐 」第一时间阅读。回复《电子书》有我为大家特别筛选的海量免费书籍资料this 也是Java中的一个关键字&#xff0c;在《Java编程思想》…

BZOJ2330 SCOI2011糖果

复习了一波差分约束。 http://blog.csdn.net/my_sunshine26/article/details/72849441 构图方式记住就好。 本题要倒序插入否则会被卡。 1 #include<bits/stdc.h>2 using namespace std;3 const int N1e510;4 struct node{5 int to,nex,w;6 }e[N<<2];7 int hea…

受小动物大脑结构启发,研究人员开发出新的深度学习模型:更少神经元,更多智能...

大数据文摘出品来源&#xff1a;sciencedaily编译: 朱科锦、coolboy从搜索引擎到自动驾驶汽车&#xff0c;人工智能已经进入了我们的日常生活。这与近年来计算能力的巨大提升有关。但是&#xff0c;最新的人工智能研究成果表明&#xff0c;更简单、更小的神经网络可以比以前更好…

python画画用哪库好_小白开始学Python最著名的绘图库

原标题&#xff1a;小白开始学Python最著名的绘图库 这是菜鸟学Python的第101篇原创文章 数据分析里面可视化是重要的环节&#xff0c;辛苦把数据采集&#xff0c;然后经历了很多工序的清洗之后&#xff0c;最后要展现给用户&#xff0c;最好的方法就是数据可视化。数据可视化是…

犯罪团伙

1 、犯罪团伙gang.cpp警察抓到了 n 个罪犯&#xff0c;警察根据经验知道他们属于不同的犯罪团伙&#xff0c;却不能判断有多少个团伙&#xff0c;但通过警察的审讯&#xff0c;知道其中的一些罪犯之间相互认识&#xff0c;已知同一犯罪团伙的成员之间直接或间接认识。有可能一…

计算机类对口升学都可以升啥专业,计算机专业对口升学专业试题.doc

计算机专业对口升学专业试题2010年对口升学班计算机专业期末考试专业试卷姓名第一部分:C语言部分(总分130分)一、选择题&#xff1a;(十小题&#xff0c;每题3分)1、C语言规定&#xff1a;在一个源程序中&#xff0c;main( )函数的位置( )A必须在最前面   B必须在系统调用的…

​2021年人工智能的四大趋势

来源&#xff1a;工信头条PART Ⅰ前沿资讯2021年人工智能的四大趋势美国《福布斯》双周刊网站刊载题为《2021年人工智能的四大趋势》的报道&#xff0c;作者系伯纳德马尔&#xff0c;文章根据当下形势&#xff0c;预测了明年人工智能的四个趋势。在2020年全球疫情暴发和世界被彻…