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

单例模式的两种设计

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


1. 饿汉模式 (Eager Initialization)

饿汉模式在程序启动时就创建实例,线程安全。

cpp

class EagerSingleton {
public:// 删除拷贝构造函数和赋值运算符EagerSingleton(const EagerSingleton&) = delete;EagerSingleton& operator=(const EagerSingleton&) = delete;// 提供全局访问点static EagerSingleton& getInstance() {return instance;}void doSomething() {std::cout << "EagerSingleton is doing something." << std::endl;}private:// 私有构造函数EagerSingleton() = default;// 类加载时就初始化实例static EagerSingleton instance;
};// 在类外初始化静态成员
EagerSingleton EagerSingleton::instance;

特点:

  • 线程安全(因为实例在main函数之前初始化)

  • 简单直接

  • 可能造成资源浪费(如果从未使用)

2. 懒汉模式 (Lazy Initialization)

懒汉模式在第一次使用时才创建实例,需要考虑线程安全问题。

双重检查锁定版(传统线程安全实现)

cpp

#include <mutex>class DoubleCheckedLockingSingleton {
public:static DoubleCheckedLockingSingleton& getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mutex);if (instance == nullptr) {instance = new DoubleCheckedLockingSingleton();}}return *instance;}void doSomething() {std::cout << "DoubleCheckedLockingSingleton is doing something." << std::endl;}private:DoubleCheckedLockingSingleton() = default;~DoubleCheckedLockingSingleton() = default;DoubleCheckedLockingSingleton(const DoubleCheckedLockingSingleton&) = delete;DoubleCheckedLockingSingleton& operator=(const DoubleCheckedLockingSingleton&) = delete;static DoubleCheckedLockingSingleton* instance;static std::mutex mutex;
};// 初始化静态成员
DoubleCheckedLockingSingleton* DoubleCheckedLockingSingleton::instance = nullptr;
std::mutex DoubleCheckedLockingSingleton::mutex;

http://www.dtcms.com/a/181180.html

相关文章:

  • 手动修改uart16550的FIFO深度?
  • 从0开始学习大模型--Day04--大模型的框架以及基本元素
  • 深入探索Laravel框架中的Blade模板引擎
  • C语言 第六章 结构体(2)
  • MySQL核心内容【持续更新中】
  • 简述Linux操作系统并安装配置Linux
  • 26考研——中央处理器_指令执行过程(5)
  • 【 SVG动态拼接】前端生成阻抗电路图
  • 仁合医疗核心产品:引领医疗科技新潮流
  • LLM量化方法:ZeroQuant、LLM.int8()、SmoothQuant、GPTQ、AWQ
  • CRC 循环冗余校验
  • Vue3 + Element Plus 动态表单实现
  • vscode离线安装python插件
  • git高效杀器——cz-customizable 搭配 commitlint
  • 抖音到店摸着京东外卖过河
  • 树初步 #1(插排串联 - 辽宁省2024CCPC)
  • 【八股消消乐】你在项目中如何优化垃圾回收机制?
  • 动态规划之背包问题:组合优化中的经典NP挑战
  • 基于vue框架的电子商城m8qu8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • WPDRRC 模型:构建动态闭环的信息安全防御体系
  • 【RAG】重点部分 RAG-Fusion, Decomposition, HyDE 和 Routing
  • apipost快捷使用实例
  • 耳机插进电脑只有一边有声音怎么办 解决方法分享
  • Java——包装类
  • 【大模型面试每日一题】Day 13:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者?
  • MLX-Audio:高效音频合成的新时代利器
  • 依赖关系-根据依赖关系求候选码
  • 基于Llama3的开发应用(一):Llama模型的简单部署
  • 力扣刷题 每日四道
  • vue项目的创建