iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++单例模式的懒汉模式和饿汉模式怎么实现
  • 730
分享到

C++单例模式的懒汉模式和饿汉模式怎么实现

2023-06-29 12:06:20 730人浏览 独家记忆
摘要

本文小编为大家详细介绍“c++单例模式的懒汉模式和饿汉模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++单例模式的懒汉模式和饿汉模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。懒汉模式懒

本文小编为大家详细介绍“c++单例模式的懒汉模式和饿汉模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++单例模式的懒汉模式和饿汉模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

懒汉模式

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

#include <iOStream>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;}; //将唯一指向实例的指针初始化为nullptrSingelton *Singelton::single = nullptr;int Singelton::m_count = 0;Singelton *Singelton::GetSingelton(){    if(single == nullptr){//判断是不是第一次使用        single = new Singelton;    }    return single;}void Singelton::print(){    cout<<m_count<<endl;}int main(){singleton* a1 = singleton::GetInstance();cout << a1 << endl;a1->print();singleton* a2 = singleton::GetInstance();cout << a2 << endl;a2->print();system("pause");return 0;}

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

他有一个指向唯一实例的静态指针,并且是私有的。

它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例。

它的构造函数是私有的,这样就不能从别处创建该类的实例。

饿汉模式

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

#include <iostream>#include <process.h>#include <windows.h>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<<m_count<<endl;}int main(){cout << "we get the instance" << endl;singleton* a1 = singleton::getinstance();singleton* a2 = singleton::getinstance();singleton* a3 = singleton::getinstance();cout << "we destroy the instance" << endl;system("pause");return 0;}

线程安全的懒汉模式

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

#include<iostream>#include<mutex>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++单例模式的懒汉模式和饿汉模式怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++单例模式的懒汉模式和饿汉模式怎么实现

本文链接: https://www.lsjlt.com/news/324646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++单例模式的懒汉模式和饿汉模式怎么实现
    本文小编为大家详细介绍“C++单例模式的懒汉模式和饿汉模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++单例模式的懒汉模式和饿汉模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。懒汉模式懒...
    99+
    2023-06-29
  • C++单例模式的懒汉模式和饿汉模式详解
    目录懒汉模式饿汉模式线程安全的懒汉模式总结懒汉模式 懒汉模式在第一次用到类实例的时候才会去实例化,就是不到调用getInstance函数时,这个类的对象是一直不存在的。懒汉本身是线程...
    99+
    2024-04-02
  • Java单例模式中的饿汉和懒汉模式怎么实现
    今天小编给大家分享一下Java单例模式中的饿汉和懒汉模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是单例模式...
    99+
    2023-07-05
  • 设计模式之单例模式(懒汉, 饿汉)
    文章目录 一. 单例模式概述二. 单例模式的实现1. 饿汉模式2. 懒汉模式 一. 单例模式概述 单例模式是一种常用的软件设计模式, 该模式的主要目的是确保某一个类在内存中只能有一个实...
    99+
    2023-09-05
    单例模式 设计模式 java 多线程 线程安全
  • java 单例模式(懒汉式与饿汉式)
    java 单例模式单例模式是一种常用的软件设计模式。在它的可信结构中只包含一个被实例化单例的特殊类。通过单例设计模式可以把整系统中的一个类只有一个实例。单例设计模式又分为两种方式,懒汉式和饿汉式。 (1)懒汉式,就是只有当调用getInst...
    99+
    2023-05-31
    java 单例模式 ava
  • 详解Java单例模式中的饿汉和懒汉模式
    目录一.什么是单例模式一.饿汉模式1.饿汉模式的概念2.饿汉模式代码3.多线程是否线程安全二.懒汉模式1.懒汉模式的概念2.单线程情况下的懒汉模式3.多线程情况下的懒汉模式一.什么是...
    99+
    2023-05-14
    Java单例模式 Java单例饿汉模式 Java单例懒汉模式
  • 24种设计模式之单例模式(饿汉式、懒汉式)
    一、单例模式 单例模式( Singleton Pattern )是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛,例如,总统,班主任等。J2EE标准中的Servl...
    99+
    2023-09-23
    java Powered by 金山文档
  • Java设计模式之单例模式实例详解【懒汉式与饿汉式】
    本文实例讲述了Java设计模式之单例模式。分享给大家供大家参考,具体如下:单例模式就是产生一个对象实例,供外外部访问。它的应用场景就是在这个类在全局真资源需要统一访问,否则会造成混乱时,才有必要设计成单例。懒汉式,就是在使用这个对象时,才去...
    99+
    2023-05-31
    java 设计模式 单例模式
  • Java单例模式的线程安全,饿汉和懒汉模式详解
    单例模式 创建唯一的一个变量(对象),在类中将构造函数设为protected或者private(析构函数设为相对应的访问权限),故外部不能实例化对象,再提供访问它的一个全局访问点,即...
    99+
    2024-04-02
  • java 中单例模式饿汉式与懒汉式的对比
    java 中单例模式饿汉式与懒汉式的对比概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。以前我们的做法是设置一个全局变量,也就是让它使得一个对象被访问。但是它不能防止你实例多个对象。这时我们可以让类自身负责保存它的唯一实例,这个...
    99+
    2023-05-31
    java 单例模式 中单
  • Java的懒汉与饿汉模式怎么实现
    今天小编给大家分享一下Java的懒汉与饿汉模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,我们先了解下单例模...
    99+
    2023-06-27
  • java中懒汉和饿汉模式有什么不同
    这期内容当中小编将会给大家带来有关java中懒汉和饿汉模式有什么不同,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2...
    99+
    2023-06-14
  • Java多线程案例之单例模式懒汉+饿汉+枚举
    目录前言:1.单例模式概述2.单例模式的简单实现2.1饿汉模式2.2懒汉模式2.3枚举实现单例模式前言: 本篇文章将介绍Java多线程中的几个典型案例之单例模式,所谓单例模式,就是一...
    99+
    2024-04-02
  • 一文详解Java的饿汉和懒汉设计模式
    目录饿汉设计模式懒汉设计模式饿汉和懒汉模式的区别本文主要讲述java的饿汉和懒汉设计模式 饿汉和懒汉设计模式的目的:使得该类的对象,只能有一个,不允许其他类,创建该类的对象。 饿汉设...
    99+
    2022-12-20
    Java饿汉 懒汉 设计模式 Java饿汉设计模式 Java 懒汉设计模式 Java 设计模式
  • 使用java怎么实现一个饿汉模式单例
    今天就跟大家聊聊有关使用java怎么实现一个饿汉模式单例,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一...
    99+
    2023-06-14
  • java懒汉式和饿汉式有什么不同
    懒汉式和饿汉式都是单例设计模式的实现方式,但它们有以下不同:1. 初始化时间:饿汉式是在类加载的时候就创建单例对象,而懒汉式是在第一...
    99+
    2023-08-30
    java
  • 怎么在java中实现一个饱汉模式单例
    这篇文章将为大家详细讲解有关怎么在java中实现一个饱汉模式单例,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程...
    99+
    2023-06-14
  • C++怎么实现单例模式
    本篇内容介绍了“C++怎么实现单例模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多线程环境下的单例模式Instance方法是这样实现的:...
    99+
    2023-06-19
  • C#设计模式之单例模式
    单例模式也是创建型模式的一种,也是23种设计模式中比较简单的一种。见名思意,在整个软件系统中,只有某个类型的一个对象,并且访问他的地方也只有一个,也就是只有一个全局对象访问点,这个实...
    99+
    2024-04-02
  • java设计模式之怎么实现单例模式
    这篇文章主要介绍了java设计模式之怎么实现单例模式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java设计模式之怎么实现单例模式文章都会有所收获,下面我们一起来看看吧。单元素的枚举类型经常成为实现 Sing...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作