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

饿汉模式和懒汉模式

🧠 一、核心区别概览

特性饿汉模式(Eager)懒汉模式(Lazy)
实例创建时机程序启动时立即创建实例第一次调用时才创建实例
是否线程安全天然线程安全(静态初始化保证)需要手动加锁确保安全
内存占用提前分配,可能浪费资源按需创建,节省资源
实现复杂度简单稍复杂(涉及同步)
适用场景实例一定会用到实例可能不会被用到

⚙️ 二、饿汉模式(Eager Singleton)

思路:
类加载时就创建实例,确保线程安全,但即使从未使用也会占用内存。

✅ 实现示例:

#include <iostream>
using namespace std;class Singleton {
private:static Singleton instance; // 提前创建好实例Singleton() { cout << "Eager Singleton Created\n"; }public:// 禁止复制与赋值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() {return instance;  // 返回唯一实例}void show() {cout << "Hello from Eager Singleton!" << endl;}
};// 静态成员初始化
Singleton Singleton::instance;int main() {Singleton& s1 = Singleton::getInstance();Singleton& s2 = Singleton::getInstance();cout << "是否为同一实例: " << (&s1 == &s2) << endl;s1.show();return 0;
}

输出:

Eager Singleton Created
是否为同一实例: 1
Hello from Eager Singleton!

优点:

  • 实现简单,天然线程安全

  • 程序启动时初始化,无需加锁

⚠️ 缺点:

  • 如果实例很大但一直没用到,会浪费内存

  • 初始化顺序不易控制


⚙️ 三、懒汉模式(Lazy Singleton)

思路:
实例在第一次使用时才创建。
但要注意多线程环境下的同步问题。

✅ 非线程安全懒汉模式(最简单版本)

#include <iostream>
using namespace std;class Singleton {
private:static Singleton* instance;Singleton() { cout << "Lazy Singleton Created\n"; }public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) { // 第一次调用才创建instance = new Singleton();}return instance;}
};// 静态成员初始化
Singleton* Singleton::instance = nullptr;int main() {Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();cout << "是否为同一实例: " << (s1 == s2) << endl;
}

⚠️ 问题:
多线程下可能同时进入 if (instance == nullptr),产生多个实例。


✅ 线程安全懒汉模式(双重检查锁)

#include <iostream>
#include <mutex>
using namespace std;class Singleton {
private:static Singleton* instance;static mutex mtx;Singleton() { cout << "Thread-Safe Lazy Singleton Created\n"; }public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) {         // 第一次检查lock_guard<mutex> lock(mtx);   // 加锁if (instance == nullptr) {     // 第二次检查instance = new Singleton();}}return instance;}
};// 初始化静态变量
Singleton* Singleton::instance = nullptr;
mutex Singleton::mtx;int main() {Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();cout << "是否为同一实例: " << (s1 == s2) << endl;
}

优点:

  • 按需加载,节省资源

  • 双重检查锁保证线程安全

⚠️ 缺点:

  • 实现较复杂

  • 静态成员销毁时机需谨慎(程序退出时可能导致未释放)


🧭 四、总结对比

对比项饿汉模式懒汉模式
创建时机程序启动时首次调用时
线程安全性天然安全需加锁实现
性能启动慢,但访问快启动快,但首次调用慢
内存占用可能浪费资源更加节省内存
实现难度简单稍复杂
推荐使用对象轻量、使用频繁对象重量、使用偶尔

🧩 五、总结一句话

  • 饿汉模式:启动即建,全程无锁。

  • 懒汉模式:用时才建,双锁防乱。

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

相关文章:

  • 南京凯盛建设集团官方网站深圳数据中心建设公司
  • 新版点微同城主题源码34.7+全套插件+小程序前后端 源文件
  • 房产中介网站建设进度慕枫网络科技有限公司
  • 周口建设网站的中英文网站好处
  • 商城网站建设开发还有做网站的必要吗
  • QSS简介与应用
  • 上海域格ASR平台cat1模块GPS功能介绍及测试
  • GKE连接私有Cloud SQL疑难问题排查实录
  • 深入理解系统调用:用户态与内核态的边界与协作
  • 网站运营怎样做wordpress微软雅黑
  • C++无锁队列实现的常见误区
  • 朝花夕拾(名字太短)
  • 阿里巴巴国内网站怎么做山东省市场监督管理局
  • 常州网站建设服务专业设计网站公司
  • 网站建设类公司可以拿哪些项目资金项目推广平台排行榜
  • 变增益PID在收放卷控制中的应用(汇川Easy系列ST源代码)
  • 【Janet】绑定(def和var)
  • 南山区做网站公司网站建设程序员提成
  • Photoshop - Photoshop 工具栏(28)魔术橡皮擦工具
  • 建设网站的费用明细大概有哪些网站模板带后台下载
  • 网站建设下一步工作计划网站开发怎样转h5页面
  • 做淘宝有没有店小秘类型的网站自己做网站排名好吗
  • 网站开发后端做什么如何建设自己的php网站
  • 使用Terraform创建私有Cloud SQL实例及连接测试
  • 汶上网站开发点金wordpress
  • 信息学奥赛一本通 2090:【22CSPS提高组】假期计划(holiday) | 洛谷 P8817 [CSP-S 2022] 假期计划
  • 算法学习 25 集合
  • 【西门子变频器的理解与调试】
  • 泉州企业自助建站系统网站seo优化管理系统
  • 高端网站建设 房产某企业网站的分析优化与推广