C++单例模式的懒汉模式和饿汉模式怎么实现
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本文小编为大家详细介绍"C++单例模式的懒汉模式和饿汉模式怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"C++单例模式的懒汉模式和饿汉模式怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路
千家信息网最后更新 2025年01月23日C++单例模式的懒汉模式和饿汉模式怎么实现
本文小编为大家详细介绍"C++单例模式的懒汉模式和饿汉模式怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"C++单例模式的懒汉模式和饿汉模式怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
懒汉模式
懒汉模式在第一次用到类实例的时候才会去实例化,就是不到调用getInstance函数时,这个类的对象是一直不存在的。懒汉本身是线程不安全的。
#includeusing namespace std;class Singelton{private: Singelton(){ m_count ++; printf("Singelton begin\n"); Sleep(1000);// 加sleep为了放大效果 printf("Singelton end\n"); } static Singelton *single;//定义一个唯一指向实例的指针,并且是私有的public: static Singelton *GetSingelton();//定义一个公有函数,可以获取这个唯一实例 static void print(); static int m_count;}; //将唯一指向实例的指针初始化为nullptrSingelton *Singelton::single = nullptr;int Singelton::m_count = 0;Singelton *Singelton::GetSingelton(){ if(single == nullptr){//判断是不是第一次使用 single = new Singelton; } return single;}void Singelton::print(){ cout< print(); singleton* a2 = singleton::GetInstance(); cout << a2 << endl; a2->print(); system("pause"); return 0;}
懒汉模式的singleton类有以下特点:
1.他有一个指向唯一实例的静态指针,并且是私有的。
2.它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例。
3.它的构造函数是私有的,这样就不能从别处创建该类的实例。
饿汉模式
饿汉模式在单例类定义的时候(即在main函数之前)就进行实例化。因为main函数执行之前,全局作用域的类成员静态变量m_Instance已经初始化,故没有多线程的问题。
#include#include #include using namespace std;class Singelton{private: Singelton(){ m_count ++; printf("Singelton begin\n"); Sleep(1000); // 加sleep为了放大效果 printf("Singelton end\n"); } static Singelton *single;//定义一个唯一指向实例的指针,并且是私有的public: static Singelton *GetSingelton();//定义一个公有函数,可以获取这个唯一实例 static void print(); static int m_count;};// 饿汉模式的关键:定义即实例化Singelton *Singelton::single = new Singelton;int Singelton::m_count = 0;Singelton *Singelton::GetSingelton(){ // 不再需要进行实例化 //if(single == nullptr){ // single = new Singelton; //} return single;}void Singelton::print(){ cout< 线程安全的懒汉模式
在多线程环境下,懒汉模式的上述实现方式是不安全的,原因在于在判断instance是否为空时,可能存在多个线程同时进入if中,此时可能会实例化多个对象。于是出现了二重锁的懒汉模式,实现代码如下:
#include#include using namespace std;/*单例模式:构造函数私有化,对外提供一个接口*///线程安全的单例模式class lhsingleClass {public: static lhsingleClass* getinstance() {//双重锁模式 if (instance == nullptr) {//先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回 //进入后加锁 i_mutex.lock(); if (instance == nullptr) {//再判断一次,确保不会因为加锁期间多个线程同时进入 instance = new lhsingleClass(); } i_mutex.unlock();//解锁 } return instance; }private: static lhsingleClass* instance; static mutex i_mutex;//锁 lhsingleClass(){}};lhsingleClass* lhsingleClass::instance=nullptr;mutex lhsingleClass::i_mutex;//类外初始化 int main(){ lhsingleClass* lhsinglep5 = lhsingleClass::getinstance(); lhsingleClass* lhsinglep6 = lhsingleClass::getinstance(); cout << lhsinglep5 << endl; cout << lhsinglep6 << endl; system("pause"); return 0;} 此代码共进行了两次判断:
先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回。
再判断一次,确保不会因为加锁期间多个线程同时进入。
读到这里,这篇"C++单例模式的懒汉模式和饿汉模式怎么实现"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
模式
实例
懒汉
函数
线程
私有
安全
多个
指向
指针
C++
同时
文章
时候
代码
内容
对象
效果
第一次
静态
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
新技术防护网络安全
数据库建立四个表之间的联系
球员球队数据库
2014 数据库 均衡负债
大一专科计算机网络技术课本
搭建灾备数据库同步dg
网络安全需要挑战与机遇
中国网络安全大赛kk战队
网络安全监测装置有哪些
公安网络安全的管理制度
2020 网络安全宣传周
unturned服务器怎么锁车
hive如何删除数据库报错
个人如何建立网络安全
关于校园网络安全的句子
插入数据到hive数据库
数据库字符集和编码
山西高校党建软件开发软件
20个数据库设计图
易语言数据库用什么比较好
不属于网络技术硬件基础
java神通数据库配置
数据库二个圈圈的符号是什么
hp服务器 硬盘红灯
哪些企业需要纳入统计局数据库
英灵神殿服务器开新号
大学网络安全1500
主机屋连接不上数据库
网络安全教育方面100个字
汶上软件开发初级教程教学视频