这里写目录标题

  • 懒汉模式
  • 饿汉模式
  • 线程安全的懒汉模式

懒汉模式

懒汉模式在第一次用到类实例的时候才会去实例化,就是不到调用getInstance函数时,这个类的对象是一直不存在的。懒汉本身是线程不安全的

#include <iostream>
using namespace std;// version 1.0
class Singleton
{private:static Singleton* instance;
private:Singleton() {};~Singleton() {};Singleton(const Singleton&);Singleton& operator=(const Singleton&);
public:static Singleton* getInstance();
};// init static member
Singleton* Singleton::instance = NULL;Singleton *Singleton::GetSingleton(){if(instance == nullptr){//判断是不是第一次使用instance = new Singleton;}return single;
}int main()
{singleton* a1 = singleton::GetInstance();return 0;
}

懒汉模式的singleton类有以下特点:

  1. 他有一个指向唯一实例的静态指针,并且是私有的。
  2. 它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例。
  3. 它的构造函数是私有的,这样就不能从别处创建该类的实例。

饿汉模式

饿汉模式在单例类定义的时候(即在main函数之前)就进行实例化。因为main函数执行之前,全局作用域的类成员静态变量m_Instance已经初始化,故没有多线程的问题。

#include <iostream>
#include <process.h>
#include <windows.h>
using namespace std;class Singleton
{private:static Singleton* instance;
private:Singleton() {};~Singleton() {};Singleton(const Singleton&);Singleton& operator=(const Singleton&);
public:static Singleton* getInstance();
};// 饿汉模式的关键:定义即实例化
Singleton* Singleton::instance = new Singleton;Singleton*Singleton::GetSingleton(){// 不再需要进行实例化//if(instance == nullptr){//    instance = new Singleton;//}return single;
}int main()
{singleton* a1 = singleton::getinstance();return 0;
}

线程安全的懒汉模式

在多线程环境下,懒汉模式的上述实现方式是不安全的,原因在于在判断instance是否为空时,可能存在多个线程同时进入if中,此时可能会实例化多个对象。于是出现了二重锁的懒汉模式,实现代码如下:

#include <iostream>
using namespace std;class Singleton
{private:static Singleton* instance;
private:Singleton() {};~Singleton() {};Singleton(const Singleton&);Singleton& operator=(const Singleton&);
public:static Singleton* getInstance();static mutex i_mutex;//锁
};//类外初始化,将唯一指向实例的指针初始化为nullptr
Singleton* Singleton::instance = nullptr;
mutex Singleton::i_mutex;Singleton *Singleton::GetSingleton(){//双重锁模式//因为获取锁是很浪费时间的,因此先判断single是否为空,如果为空则进入,不为空说明已经存在实例,直接返回。if (instance == nullptr){//进入后加锁i_mutex.lock();//再判断一次,因为可能有多个线程在lock处等待,一个线程成功之后,会将single设置为非空,这样下个线程就算拿到lock资源,再进去发现指针非空就离开了。if (instance == nullptr){instance = new lhsingleClass();}i_mutex.unlock();//解锁}return instance ;
}int main()
{singleton* a1 = singleton::GetInstance();system("pause");return 0;
}

此代码共进行了两次判断:

  • 先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回。
  • 再判断一次,因为可能有多个线程在lock处等待,一个线程成功之后,会将single设置为非空,这样下个线程就算拿到lock资源,再进去发现指针非空就离开了。

单例模式的懒汉模式和饿汉模式相关推荐

  1. 单例模式---懒汉模式与饿汉模式

    单例模式:1)一个类只能创建一个实例2)构造函数和静态变量(加载类时即初始化)需为private3)get方法应该为public static,可供全局访问 //懒汉模式 public class l ...

  2. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

  3. 2023-01-26 JS设计模式-单例模式:单例模式的原理和实现,懒汉模式和饿汉模式,单例模式实现登录框

    文章目录 1.什么是单例模式? 介绍 特点 结构 2.如何实现一个单例模式? 思路 实现代码 3.单例模式的优缺点 4.懒汉模式和饿汉模式 懒汉模式:一开始不会实例化,什么时候用才new出来实例化 饿 ...

  4. 大聪明教你学Java设计模式 | 第一篇:单例模式 (懒汉模式和饿汉模式)

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  5. 单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)

    文章目录 前言 一.单例模式的概念 1.2单例模式的分类 1.2懒汉和饿汉的利弊 二.代码实现 1.饿汉模式 2.懒汉模式 总结 前言 提示:单例模式的出现.由于在某些场景中你最多而且必须有一个对象存 ...

  6. C# 设计模式之单例模式(懒汉模式、饿汉模式、静态内部类模式)

    C# 设计模式之单例模式(懒汉模式.饿汉模式.静态内部类模式) 应用场景:在整个软件运行生命周期内,一个类只允许一次实例化,例如数据库连接池的连接对象创建:通过使用单例模式来避免反复创建连接对象,从而 ...

  7. Java 懒汉模式与饿汉模式

    懒汉模式与饿汉模式 1.饿汉模式demo 来了就要吃,相当于有现成的- public class EleManSingleton { //1.创建类的唯一实例,使用private static修饰 p ...

  8. 设计模式——单例模式(懒汉模式,饿汉模式)

    声明: 本博客参考C语言中文网和优秀博客总结得出: (1)C语言中文网链接 (2)优秀博客链接 单例模式的定义: 指一个类只有一个实例,且该类能自行创建这个实例的一种模式.例如,Windows 中只能 ...

  9. C++单例模式 : 懒汉模式 与 饿汉模式

     单例模式:         只能有一个实例,有懒汉和饿汉区分,实现核心思想:         1.构造函数私有化         2.使用静态函数作为接口来获取类对象 1.懒汉模式:         ...

  10. 单例模式(懒汉模式和饿汉模式)

    单例模式 单例模式的两种方式 1.饿汉模式 2.懒汉模式 懒汉模式代码

最新文章

  1. 活久见!64 张图带你 Maven 实战通关
  2. c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的
  3. 【转】Oracle Outline使用方法及注意事项
  4. [javaEE] 三层架构案例-用户模块(二)
  5. 海通证券签约神策数据 数据赋能构建数字化运营闭环
  6. 【C++】构建哈希表
  7. python自动化报表定时跑_POINTer分享:Python如何做报表自动化
  8. 数据结构 二、向量(接口与实现and可扩容向量)
  9. C++从0到1的入门级教学(十一)——友元
  10. 【英语学习】【WOTD】coin of the realm 释义/词源/示例
  11. Linux系统中安装软件的三种方法(三)
  12. OpenGL学习笔记:模型变换、视图变换、投影变换 、视口变换、操作矩阵堆栈
  13. oracle 自定义表类型赋值,Oracle自定义类型 Record + PL/SQL表
  14. STM32 AES 加解密流程梳理
  15. django框架搭建网页后台,运行后网页打不开的解决方法--windows系统下
  16. 从云效1.0到2.0的升级,看技术如何驱动企业提效
  17. 【原创】Magisk+Shamiko过APP ROOT检测
  18. 几句代码让Ios系统内核崩溃
  19. GF1_WFV(高分一号宽幅)GF6_WFV(高分六号宽幅)GF4(高分四号)CB04(中巴04星)免费下载方式简介
  20. stopstart按钮怎么用_汽车Start-Stop启停技术简明讲解

热门文章

  1. linux操作系统有哪些
  2. 如何在虚拟机安装鸿蒙os,VirtualBox安装教程
  3. 远程服务器网刻系统,网刻-wu123119-ChinaUnix博客
  4. p750服务器配置信息,P750的一些配置
  5. 操作系统日志收集与分析
  6. 输入需求自动生成代码,这个AI有点厉害,可以替代真人吗?
  7. CF 86D 莫队(卡常数)
  8. idea工程在maven projects中显示灰色的解决办法
  9. 测试用例设计方法——黑盒测试和白盒测试
  10. ideaIU-2020.3.2安装教程以及导入第一个spring boot项目运行和环境配置教程