C++单例模式的懒汉模式和饿汉模式怎么实现
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,本文小编为大家详细介绍"C++单例模式的懒汉模式和饿汉模式怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"C++单例模式的懒汉模式和饿汉模式怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路
千家信息网最后更新 2025年11月16日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安全错误
数据库的锁怎样保障安全
数据库字符串转换成数字
厦门软件开发外包公司哪家好
网络技术中按位与运算
可用的免费代理服务器
鞍山市弹性云服务器租用
我的服务器被办了 用英语怎么说
网络安全信息工程师好考吗
工信部双随机一公开网络安全
绝对演绎服务器维护多长时间
通过命令行导入数据库
原神小米服务器可以联机吗
宁德手机软件开发
有什么案例数据库
大学生租房网络安全
杭州电商软件开发
缠绕膜可以用于服务器吗
网络安全哪个公司做的最好
安装数据库报错
网络安全适合女生的手机软件
邮件提示网络安全警告
工信部认证考试软件开发
图片存储在服务器上
p2p网络技术原理pdf
公司网络安全培训措施
美篇软件开发是谁
传说对决为什么连接不了服务器
湘西软件开发
计算机网络技术配伍题答案
软件开发是什么征收品目
2008数据库文件收缩