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

单例模式的两种设计

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


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.xdnf.cn/news/4909.html

相关文章:

  • [论文阅读]Deeply-Supervised Nets
  • Idea Code Templates配置
  • K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战
  • 工业与协议融合篇:如何将多个协议集成进一个系统?
  • OpenCV中适用华为昇腾(Ascend)后端的逐元素操作(Per-element Operations)
  • MCU存储系统架构解析
  • 面试问题(连载。。。。)
  • 【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)
  • k8s术语之secret
  • 数据库——关系代数之扩展操作
  • Java—— 集合 Collection
  • SNMP 协议介绍、开发方法及示例
  • 0X. Linux嵌入式系统(课堂笔记)
  • 基于STM32、HAL库的FT232RL USB转UART收发器 驱动程序设计
  • 基于主成分分析(PCA)的数据降维
  • 泰勒展开式
  • Ollama调优,提高性能与安全性
  • 15.thinkphp的上传功能
  • 基于redis的定时状态更新
  • SpringBoot指定项目层日志记录
  • 广东省省考备考(第五天5.8)—言语:逻辑填空(每日一练)
  • 2025 EAU UTUC指南学习笔记③:诊断策略精读——从症状到活检,如何科学判断治疗路径?
  • nextjs站点地图sitemap添加
  • Don’t Mesh with Me 论文阅读 brep llm
  • YY/T 1732-2020口腔曲面体层X射线模体
  • 系统思考助力富维东阳
  • ui生成提示词
  • ROP链-BUUCTF-cmcc_simplerop(ret2syscall)
  • 【JS逆向基础】面向对象
  • Spring AI 集成 DeepSeek V3 模型开发指南