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

单例模式:懒汉式的两种优化写法

单例模式:全局唯一实例

懒汉式:获取时才初始化

①静态局部变量实现(Meyer’s Singleton)【推荐】

/*
类内创建自身实例的可行性分析:在C++中,类可以通过静态成员函数创建自身实例。这种机制的核心在于:1.构造函数必须设为private,防止外部直接实例化2.通过静态方法控制实例的创建过程(即静态成员函数)3.必须禁用拷贝构造函数和赋值运算符(= delete)
*/
class Single
{
private:Single(){}~Single(){}Single(const Single& single){}=delete;Single& operator=(const Single& single){}=delete;
public://获取实例,注意这个static修饰的是函数本身,表示是静态成员函数//static不能修饰返回值,这个函数的返回值类型是Single&static Single& getInstance(){//Single成为静态局部变量,天然线程安全,不需要锁来同步(编译器会自动插入互斥锁)//无论调用 getInstance() 多少次,single只会初始化一次static Single single_;return single_;//可以返回静态局部变量的引用,因为函数销毁后,静态局部变量依然存在(生命周期直到程序结束)}
}

②使用双检锁,配合(类静态成员)智能指针【传统优化】

#include <memory>
#include <mutex>class Single
{
private:Single(){}~Single(){}Single(const Single& single){}Single& operator=(const Single& single){}
private://如果锁保护的变量是所有对象共享的,那么这个互斥量必须是静态变量static std::mutex mtx;//静态互斥量(所有对象公用这一个互斥量)//单例模式中,实例只有一个,所以这个智能指针也要是静态的,保证只有一个,并指向那个唯一实例static std::shared_ptr<Single> singlePtr;//静态智能指针
public:static std::shared_ptr<Single>& getInstance(){//因为实例只有一个,如果已经创建了,就不需要加锁了;只有没有实例才需要加锁if(!singlePtr)//用于提高效率{std::unique_lock<std::mutex> lock(mtx);//当多个线程同时通过第一次无锁检查(!singlePtr)时,这些线程会依次进入同步块(锁内代码)。此时,若没有第二次检查,每个获得锁的线程都会重新创建实例,导致单例失效。if(!singlePtr)//用于保证实例只创建一次singlePtr=std::make_shared<Single>();}}
};
std::mutex mtx;
std::shared_ptr<Single> singlePtr=nullptr;
http://www.xdnf.cn/news/495.html

相关文章:

  • Unity webgl 获取图片或视频数据
  • 【unity】Vulkan模式下部分Android机型使用VideoPlayer组件播放视频异常问题
  • 交易系统的构建与实战法则
  • JCST 2025年 区块链论文 录用汇总
  • 电子电器架构 --- DFMEA设计失效模式和后果分析
  • 聊一聊接口自动化测试脚本如何进行维护的?
  • 齿轮检测中的“正负之谜”:为何有的项目有,有的没有?
  • C# 预定义类型全解析
  • Selenium 入门之环境搭建
  • `Accelerate`库实现模型并行计算
  • SAP系统工艺路线的分配物料出现旧版包材
  • 第6章 类文件结构《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》
  • [特殊字符] AI 大模型的 Prompt Engineering 原理:从基础到源码实践
  • Linux | 软件仓库管理
  • 回溯算法(3):番外篇
  • 机器学习决策树
  • GESP2025年3月认证C++八级( 第三部分编程题(2)割裂)
  • ICS丨Chapter 1 Introduction to Computer System
  • C++中chrono计时器的简单使用示例
  • CF1016赛后总结
  • 常见网络问题
  • 2025年第16届蓝桥杯嵌入式竞赛学习笔记(十四):RTC实时时钟
  • 算法--打表法
  • JS案例-基于Proxy的响应式数据
  • [密码学基础]国密算法深度解析:中国密码标准的自主化之路
  • 在已有的vue项目中使用vuex
  • 鸿蒙开发11-ARKUI框架
  • 谷歌称LLMs.txt类似于关键词元标签:SEO影响与应对策略
  • 提升电脑性能!Windows超级管理器,免费使用,功能全面!
  • 开启健康养生新旅程