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

[ 设计模式 ] | 单例模式

单例模式是什么?哪两种模式?

单例模式就是一个类型的对象,只有一个,比如说搜索引擎中的索引部分,360安全卫士的桌面悬浮球。

饿汉模式和懒汉模式:饿汉模式是线程安全的,懒汉模式不是线程安全的,但是我们可以为其加锁,实现成线程安全的。

饿汉单例模式的代码实现

单例模式的实现主要在于将构造函数私有化,并且将拷贝构造和赋值拷贝禁用。

饿汉,这个对象在main函数执行之前就创建对象。

class Single
{
public:static Single* getInstance(){return &instance;}
private:static Single instance;Single(){}Single(const Single&) = delete;Single &operator=(const Single&) = delete;
};
Single Single::instance;

饿汉单例模式的问题

如果系统中有多个饿汉的对象,可能会造成系统启动过慢的问题。

懒汉单例模式的代码实现

懒汉,就是在使用这个对象的时候再去创建这个对象。

1.

基本实现,不是线程安全的。

class Single
{
public:static Single* getInstance(){if (instance == nullptr){lock_guard<std::mutex> guard(mtx);if (instance == nullptr)instance = new Single();}return instance;}
private:static Single * volatile instance;Single(){}Single(const Single&) = delete;Single& operator=(const Single&) = delete;
};
Single * volatile Single::instance = nullptr;

2.

为其加锁,线程安全的。

两层判断,避免锁的粒度太大,单线程环境下也会加锁。

std::mutex mtx;class Single
{
public:Single* getInstance(){if (instance == nullptr){lock_guard<std::mutex> guard(mtx);if (instance == nullptr)instance = new Single();}return instance;}
private:static Single * volatile instance;Single(){}Single(const Single&) = delete;Single& operator=(const Single&) = delete;
};
Single * volatile Single::instance = nullptr;

3.

class Single
{
public:static Single* getInstance(){static Single instance;return &instance;}
private:Single(){}Single(const Single&) = delete;Single& operator=(const Single&) = delete;
};

这种实现方法,我们主要探讨是不是线程安全的?我们将这段代码反汇编之后,可以发现,操作系统会在创建的时候为其加锁的,证明他是线程安全的~~

相关文章:

  • 基于大模型的子宫腺肌病全流程预测与诊疗方案研究报告
  • 利用迁移学习实现食物分类:基于PyTorch与ResNet18的实战案例
  • 【C/C++】函数模板
  • SQL数据库操作大全:从基础到高级查询技巧
  • HTML5好看的水果蔬菜在线商城网站源码系列模板9
  • 【macOS常用快捷键】
  • MySQL C API高效编程:C语言实现数据库操作的深入解析
  • 学习路线(视觉)
  • [Linux]物理地址到虚拟地址的转化
  • stm32之TIM定时中断详解
  • MODIS中国积雪物候数据集(2000-2020年)
  • Nemotron-Research-Tool-N1 如何提升大语言模型工具使用能力?
  • 使用OpenCV 和 Dlib 实现疲劳检测
  • CPT204 Advanced Obejct-Oriented Programming 高级面向对象编程 Pt.10 二叉搜索树
  • 题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置
  • 如何将腾讯云的测试集成到自己的SpringBoot中
  • 解决pycharm检测不到已经装好的conda的pytorch环境
  • 嵌入式操作系统
  • kotlin 扩展函数
  • Qt中数据结构使用自定义类————附带详细示例
  • 机器人助力、入境游、演出引流:假期纳客千万人次城市有高招
  • 俄军击落多架企图攻击莫斯科的无人机
  • 多地政府机关食堂迎来大客流,重庆荣昌区委书记给厨师们鼓劲
  • 韩国国民力量党宣布金文洙为该党总统候选人
  • 5月1日,全社会跨区域人员流动量完成33271.4万人次
  • 对谈|“对工作说不”是不接地气吗?