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

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

单例模式,用于确保一个类只有一个实例,并提供一个全局访问点以访问该实例。

饿汉式(Eager Initialization)

程序启动时就创建实例

#include <iostream>
class SingletonEager 
{
private:static SingletonEager* instance;SingletonEager() {} // 私有构造函数public:static SingletonEager* getInstance() {return instance;}
};SingletonEager* SingletonEager::instance = new SingletonEager; // 在程序启动时即创建实例int main() 
{SingletonEager* instance1 = SingletonEager::getInstance();SingletonEager* instance2 = SingletonEager::getInstance();std::cout << (instance1 == instance2) << std::endl;  // 输出 1,两个指针变量的内容相同return 0;
}

懒汉式(Lazy Initialization)

延迟初始化,即在第一次访问时才创建实例。

缺点:不是线程安全的。因为它没有考虑多线程同时访问的情况。如果多个线程同时调用 getInstance() 方法,并且在 instance 还没有被初始化之前,它们可能会同时进入条件 if (!instance) 中,导致多次创建实例,这违反了单例模式的要求。

#include <iostream>class SingletonLazy 
{
private:static SingletonLazy* instance;SingletonLazy() {} // 私有构造函数public:static SingletonLazy* getInstance() {if (!instance) {instance = new SingletonLazy;}return instance;}
};SingletonLazy* SingletonLazy::instance = nullptr;int main() {SingletonLazy* instance1 = SingletonLazy::getInstance();SingletonLazy* instance2 = SingletonLazy::getInstance();std::cout << (instance1 == instance2) << std::endl; // 输出 1,两个指针变量的内容相同return 0;
}

想要解决线程安全问题,需要做互斥操作,使用作用域互斥锁即可

class SingletonLazyThreadSafe {
private:static SingletonLazyThreadSafe* instance;static std::mutex mutex;SingletonLazyThreadSafe() {} // 私有构造函数public:static SingletonLazyThreadSafe* getInstance() {std::lock_guard<std::mutex> lock(mutex);if (!instance) {instance = new SingletonLazyThreadSafe;}return instance;}
};

变体

这种方式非常简洁,并且是线程安全的

#include <iostream>class SingletonLazy 
{
private:SingletonLazy() {} // 私有构造函数public:static SingletonLazy* getInstance() {static SingletonLazy instance;return instance;}
};SingletonLazy* SingletonLazy::instance = nullptr;int main() 
{SingletonLazy* instance1 = SingletonLazy::getInstance();SingletonLazy* instance2 = SingletonLazy::getInstance();std::cout << (instance1 == instance2) << std::endl; // 输出 1,两个指针变量的内容相同return 0;
}

相关文章:

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

单例模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点以访问该实例。 饿汉式&#xff08;Eager Initialization&#xff09; 程序启动时就创建实例 #include <iostream> class SingletonEager { private:static SingletonEager* instanc…...

Java Lambda表达式:简洁且强大的函数式编程工具

Lambda表达式是Java 8及以后版本中引入的一种函数式编程特性。它是一种匿名函数&#xff0c;允许开发人员以简洁和易读的方式编写代码&#xff0c;并且可以作为参数传递给方法或存储在变量中。Lambda表达式的基本语法如下&#xff1a;(parameters) -> expression&#xff0c…...

开源框架中的责任链模式实践

作者&#xff1a;vivo 互联网服务器团队-Wang Zhi 责任链模式作为常用的设计模式而被大家熟知和使用。本文介绍责任链的常见实现方式&#xff0c;并结合开源框架如Dubbo、Sentinel等进行延伸探讨。 一、责任链介绍 在GoF 的《设计模式》一书中对责任链模定义的&#xff1a;将…...

智能配电系统:保障电力运行安全、可控与高效

智能配电系统是一种先进的电力分配技术&#xff0c;它通过智能化、数字化和网络化等方式&#xff0c;有效地保障了电力运行的安全、可控和高效。 力安科技智能配电系统是在配电室&#xff08;含高压柜、变压器、低压柜&#xff09;、箱式变电站、配电箱及动力柜&#xff08…...

MySQL学习系列(11)-每天学习10个知识

目录 1. 数据库设计的关键因素2. 使用存储过程和函数来提高性能和可重用性3. MySQL性能优化4. 使用视图简化查询和提供数据安全性5. 数据库备份和恢复策略的重要性和实践经验6. 在分布式系统中保证数据一致性和可用性7. 理解MySQL的复制和其在实际应用中的作用8. 使用游标进行分…...

如何通过Gunicorn和Niginx部署Django

本文主要介绍如何配置Niginx加载Django的静态资源文件&#xff0c;也就是Static 1、首先需要将Django项目中的Settings.py 文件中的两个参数做以下设置&#xff1a; STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static) 然后在宝塔面板中执行python manage.…...

C语言 cortex-A7核UART总线实验

一、C 1&#xff09;uart4.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h&quo…...

asp.net C#免费反编译工具ILSpy

在维护一个没有源码的C#项目&#xff0c;只能反编译了。 项目主页 https://github.com/icsharpcode/ILSpy 使用方法 中文界面使用简单&#xff0c;把你要反编译的dll拖过去就可以了。好使&#xff01;&#xff01;&#xff01;...

演讲实录:DataFun 垂直开发者社区基于指标平台自主洞察北极星指标

在7月14日举办的 Kyligence 用户大会的数智新应用论坛上&#xff0c;DataFun COO 杜颖女士为大家带来了《垂直开发者社区基于指标平台自主洞察北极星指标》的主题演讲。接下来&#xff0c;我们一起看看 DataFun 如何在没有专门的 IT 团队的情况下&#xff0c;实现对北极星指标的…...

ffmpeg编译 Error: operand type mismatch for `shr‘

错误如下&#xff1a; D:\msys2\tmp\ccUxvBjQ.s: Assembler messages: D:\msys2\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:470: Error: operand type mismatch…...

【Windows Server 2012 R2搭建FTP站点】

打开服务器管理器——添加角色和功能 下一步 下一步 下一步 选择FTP服务器&#xff0c;勾上FTP服务和FTP扩展&#xff0c;点击下一步 安装 安装完成关闭 打开我们的IIS服务器 在WIN-XXX主页可以看到我们的FTP相关菜单 右键WIN-XXXX主页&#xff0c;添加FTP站点 输入站点名称-FT…...

python教程:使用gevent实现高并发并限制最大并发数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一&#xff0c;定义最大并发数 p Pool(20) # 二&#xff0c;导入gevent…...

借助reCAPTCHA实现JavaScript验证码功能

前言 验证码&#xff08;CAPTCHA&#xff09;是一种常见的安全验证机制&#xff0c;常用于区分真实用户和机器人。使用验证码可以有效防止恶意登录、自动注册或者密码爆破等攻击。本文将借助reCAPTCHA第三方库来实现JavaScript验证码功能。 验证码的原理 验证码的核心思想是要…...

监控数据的采集方式及原理

采集方法使用频率从高到低依次是读取 /proc目录、执行命令行工具、远程黑盒探测、拉取特定协议的数据、连接到目标对象执行命令、代码埋点、日志解析。 读取 /proc目录 /proc是一个位于内存中的伪文件系统&#xff0c;而在该目录下保存的不是真正的文件和目录&#xff0c;而是…...

Vue路由与node.js环境搭建

目录 前言 一.Vue路由 1.什么是spa 1.1简介 1.2 spa的特点 1.3 spa的优势以及未来的挑战 2.路由的使用 2.1 导入JS依赖 2.2 定义两个组件 2.3 定义组件与路径对应关系 2.4 通过路由关系获取路由对象 2.5 将对象挂载到vue实例中 2.6 定义触发路由事件的按钮 2.7 定…...

腾讯云16核服务器性能测评_轻量和CVM配置大全

腾讯云16核服务器配置大全&#xff0c;CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xff0c;…...

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载&#xff1a;https://www.postman.com/ 访问链接后&#xff0c;进入首页&#xff0c;根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件&#xff0c;会默认安装在C盘&#xff0c;安装完会…...

uni-app混合开发 navigateTo、reLaunch、redirectTo、switchTab区别

1.navigateTo 保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。 要注意的是navigateTo只能跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数&#xff1b;如果跳转url参数为tabBar的路径则无法进行跳转 2.redir…...

专业软件测评中心:关于软件性能测试的实用建议

软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用&#xff0c;它包括的测试内容丰富多样。 一、软件性能测试的实用建议   1、制定清晰的测试目标&#xff1a;明确测试目标…...

vue项目通过json-bigint在前端处理java雪花id过长导致失去精度问题

这里 我简单模仿了一个接口 这里 我单纯 返回一个long类型的雪花id 然后 前端 用 axios 去请求 大家知道 axios 会对请求数据做一次处理 而我们 data才是拿到我们java这边实际返回的东西 简单说 就是输出一下我们后端返回 的内容 这里 我们网络中显示的是 35866101868095488…...

C251编译器变量分配与内存空间解析

1. C251编译器变量分配问题解析最近在Keil C251开发环境中遇到一个有趣的现象&#xff1a;编译器似乎将部分变量分配到了特殊功能寄存器(SFR)的内存空间。查看链接器生成的MAP文件时&#xff0c;发现如下信息&#xff1a;0000DDH 0000EAH 00000EH BYTE UNIT EDATA …...

本地部署 Open Claw 保姆教程,同事还在手动整理文件,我已经让 AI 全搞定了

前言 2026 年开源圈热门的「数字员工」OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标超 28 万&#xff0c;凭「本地运行 零代码操作 自动干活」的优势圈粉无数&#xff01;很多人误以为它是普通聊天 AI&#xff0c;实则是能真正操控电脑的自动化神器 …...

Azure ML算法速查表:面向工程交付的算法选型决策地图

1. 这张“Azure ML算法速查表”到底是什么&#xff0c;又为什么值得你花时间细看&#xff1f;我第一次在客户现场看到这张表&#xff0c;是在一个凌晨三点的模型选型评审会上。客户CTO把一张A3纸拍在桌上&#xff1a;“别再扯XGBoost和LightGBM的区别了&#xff0c;我要知道——…...

终极指南:在Windows系统上完整解锁MacBook Pro Touch Bar功能

终极指南&#xff1a;在Windows系统上完整解锁MacBook Pro Touch Bar功能 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 还在为MacBook Pro在Windows系统中Touch…...

Jetson Orin AGX INT4 推理优化实践:super 分支从 9 tok/s 到 24 tok/s

Jetson Orin AGX INT4 推理优化实践&#xff1a;super 分支从 9 tok/s 到 24 tok/s 项目地址&#xff1a;https://github.com/luogantt/LLM-inference-engine 本文总结 jetson-orin-agx-super 分支上的一次端侧大模型推理优化实践。目标设备是 Jetson Orin AGX&#xff0c;目…...

【限时解密】:OpenAI DevDay未公布的Agent Runtime协议草案V2.1——它正悄然定义下一代智能体互操作标准

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI Agent智能体未来趋势 AI Agent正从单一任务执行者演变为具备自主目标分解、跨工具协同与持续环境反馈的类人智能体。其发展不再局限于模型规模扩张&#xff0c;而转向认知架构升级、可信机制构建与人机协作…...

如何用免费纹理打包器优化游戏性能:5个实战技巧提升加载速度

如何用免费纹理打包器优化游戏性能&#xff1a;5个实战技巧提升加载速度 【免费下载链接】free-tex-packer Free texture packer 项目地址: https://gitcode.com/gh_mirrors/fr/free-tex-packer Free Texture Packer 是一款完全开源的精灵表生成工具&#xff0c;专门为游…...

智谱ZCube组网架构革新:不动硬件提升15%集群推理吞吐,行业转向“挖效率”

【导语&#xff1a;过去行业在算力军备竞赛中多靠买GPU、建集群堆算力&#xff0c;如今这一路径被重新审视。智谱公开ZCube组网架构&#xff0c;在不增加硬件的情况下提升了集群推理吞吐&#xff0c;同时OpenAI等发布MRC网络协议&#xff0c;行业正从“堆硬件”向“挖效率”转向…...

Taotoken助力企业级AI应用开发,统一管理多个Agent的API成本与用量

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken助力企业级AI应用开发&#xff0c;统一管理多个Agent的API成本与用量 当团队同时运行多个基于不同大模型的智能体应用时&a…...

保姆级教程:用HWSD世界土壤数据库为SWAT模型快速搭建土壤库(附SPAW软件计算避坑指南)

从HWSD到SWAT&#xff1a;零基础构建高精度土壤数据库的完整指南 水文模型研究者常面临一个棘手问题&#xff1a;如何将全球土壤数据转化为模型可用的参数&#xff1f;HWSD&#xff08;Harmonized World Soil Database&#xff09;作为国际权威土壤数据库&#xff0c;与SWAT模…...