C++实现 单例模式实例详解

发布时间 - 2026-01-11 01:00:22    点击率:

设计模式之单例模式C++实现

一、经典实现(非线程安全)

class Singleton 
{ 
  public: 
    static Singleton* getInstance(); 
  protected: 
    Singleton(){} 
  private: 
    static Singleton *p; 
}; 
 
Singleton* Singleton::p = NULL; 
Singleton* Singleton::getInstance() 
{ 
  if (NULL == p) 
    p = new Singleton(); 
  return p; 
} 

二、懒汉模式与饿汉模式

懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;

饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。

特点与选择

由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。在访问量较小时,采用懒汉实现。这是以时间换空间。

线程安全的懒汉模式

1.加锁实现线程安全的懒汉模式

class Singleton 
{ 
  public: 
    static pthread_mutex_t mutex; 
    static Singleton* getInstance(); 
  protected: 
    Singleton() 
    { 
      pthread_mutex_init(&mutex); 
    } 
  private: 
    static Singleton* p; 
}; 
 
pthread_mutex_t Singleton::mutex; 
Singleton* Singleton::p = NULL; 
Singleton* Singleton::getInstance() 
{ 
  if (NULL == p) 
  { 
    pthread_mutex_lock(&mutex); 
    if (NULL == p) 
      p = new Singleton(); 
    pthread_mutex_unlock(&mutex); 
  } 
  return p; 
}

2.内部静态变量实现懒汉模式

class Singleton 
{ 
  public: 
  static pthread_mutex_t mutex; 
  static Singleton* getInstance(); 
  protected: 
    Singleton() 
    { 
      pthread_mutex_init(&mutex); 
    } 
}; 
 
pthread_mutex_t Singleton::mutex; 
Singleton* Singleton::getInstance() 
{ 
  pthread_mutex_lock(&mutex); 
  static singleton obj; 
  pthread_mutex_unlock(&mutex); 
  return &obj; 
} 


饿汉模式(本身就线程安全)

class Singleton 
{ 
  public: 
    static Singleton* getInstance(); 
  protected: 
    Singleton(){} 
  private: 
    static Singleton* p; 
}; 
 
Singleton* Singleton::p = new Singleton; 
Singleton* Singleton::getInstance() 
{ 
  return p; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 单例模式  # 单例模式详解  # C++实现单例模式的自动释放  # 详解C++实现线程安全的单例模式  # C++ 单例模式的几种实现方式研究  # 使用设计模式中的单例模式来实现C++的boost库  # C++实现单例模式的方法  # 这是  # 会去  # 饥不择食  # 就不  # 万不得已  # 希望能  # 可以实现  # 比较大  # 谢谢大家  # 饿了  # 肯定要  # 故名  # 加锁  # 也就是说  # protected  # span  # private  # return  # NULL  # br 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  iOS UIView常见属性方法小结  北京专业网站制作设计师招聘,北京白云观官方网站?  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  高防服务器租用首荐平台,企业级优惠套餐快速部署  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel如何实现数据库事务?(DB Facade示例)  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel如何实现本地化和多语言支持?(i18n教程)  Python自动化办公教程_ExcelWordPDF批量处理案例  昵图网官方站入口 昵图网素材图库官网入口  如何获取免费开源的自助建站系统源码?  Laravel如何自定义错误页面(404, 500)?(代码示例)  iOS中将个别页面强制横屏其他页面竖屏  进行网站优化必须要坚持的四大原则  网站制作软件免费下载安装,有哪些免费下载的软件网站?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  如何在自有机房高效搭建专业网站?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  魔方云NAT建站如何实现端口转发?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何快速搭建支持数据库操作的智能建站平台?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  在Oracle关闭情况下如何修改spfile的参数  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  C#如何调用原生C++ COM对象详解  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何用搬瓦工VPS快速搭建个人网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  网易LOFTER官网链接 老福特网页版登录地址  个人网站制作流程图片大全,个人网站如何注销?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  WordPress 子目录安装中正确处理脚本路径的完整指南