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

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

单例模式:全局唯一实例

懒汉式:获取时才初始化

①静态局部变量实现(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;

相关文章:

  • 编译报错 宏 _IOC_SIZEBITS,而这个宏在编译时未定义
  • Bash 中的数学运算详解
  • 【每天一个知识点】模式识别
  • 自动驾驶---决策规划之导航增强端到端
  • Jinja2模板引擎SSTI漏洞
  • 加密壳(二)将shellcode写入PE
  • STL——红黑树的封装及map/set的模拟实现
  • 数字孪生火星探测车,星际探索可视化
  • 泛目录二级目录【实用指南】,无极站群系统2025升级版
  • leetcode125.验证回文串
  • java蓝桥杯b组
  • 20-算法打卡-哈希表-赎金信-leetcode(383)-第二十天
  • 用sed替换文本 笔记250419
  • Linux 进程间通信详解
  • 鼠标移动操作
  • C++原码、反码和补码
  • YuE本地部署完整教程,可用于ai生成音乐,歌曲
  • 6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写
  • Linux cmp 命令使用详解
  • Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验
  • 广西柳州23年的蝶变:从“酸雨之城”到“文明之城”
  • 伊朗艺术中的中国风
  • 一场小型越野赛为何吸引众多越野大神打卡?
  • 十四届全国人大常委会第十五次会议将于4月27日至30日举行
  • 重庆网红景点“莲花茶摊”被市民投诉,官方:采纳意见,整改!
  • 网约车司机要乘客提前200米下车遭殴打,警方介入