单例模式介绍

单例模式主要有2中形式,一种是饿汉式,一种是懒汉式

饿汉式:程序一加载单例模式就已经创建了,也就很饥饿嘛。因为是静态属性进行单例初始化,所以优点是线程是安全的,缺点是无论用户是否使用单例对象都会创建单例对象

懒汉式:当用户使用单例对象时,才去创建单例对象,所以很懒惰嘛。优点是用户不使用就不会创建对象,缺点是 当遇到多线程是,是线程不安全的,但是我们可以使用加强版的也就是线程安全的懒汉式,下面我们会进行讲解

饿汉式和懒汉式代码

代码展示

#include <iostream>using namespace std;
class Singleton_Hungry
{
private:Singleton_Hungry(){cout << "我是饿汉式,在程序加载时,我就已经存在了。" << endl;}static Singleton_Hungry* singleton;
public:static Singleton_Hungry* getInstace(){return singleton;}};
//静态属性类外初始化
Singleton_Hungry* Singleton_Hungry::singleton = new Singleton_Hungry;class Singleton_Lazy
{
private:Singleton_Lazy(){cout << "我是懒汉式,在别人需要我的时候,我才现身。" << endl;}static Singleton_Lazy* singleton;
public:static Singleton_Lazy* getInstance(){if (NULL == singleton){singleton = new Singleton_Lazy;}return singleton;}
};
Singleton_Lazy* Singleton_Lazy::singleton = NULL;int main(int argc, char *argv[])
{Singleton_Hungry *hungry1 = Singleton_Hungry::getInstace();Singleton_Hungry *hungry2 = Singleton_Hungry::getInstace();cout << "hungry1地址:" << hungry1 << ",hungry2地址:" << hungry2 << endl;Singleton_Lazy *lazy1 = Singleton_Lazy::getInstance();Singleton_Lazy *lazy2 = Singleton_Lazy::getInstance();cout << "lazy1地址:" << lazy1 << ",lazy2地址:" << lazy1 << endl;return 0;
}

运行结果

懒汉式遇到多线程

由于懒汉式在用户需要是才进行单例对象的创建,如果遇到多线程容易发生内存泄漏,我们可以用c++中的线程互斥对象mutex来进行加强多线程用thread类进模拟

代码展示

#include <iostream>
#include <mutex>
#include <thread>using namespace std;
mutex mu;//线程互斥对象
class Singleton_Hungry
{
private:Singleton_Hungry(){cout << "我是饿汉式,在程序加载时,我就已经存在了。" << endl;}static Singleton_Hungry* singleton;
public:static Singleton_Hungry* getInstace(){return singleton;}};
//静态属性类外初始化
Singleton_Hungry* Singleton_Hungry::singleton = new Singleton_Hungry;class Singleton_Lazy
{
private:Singleton_Lazy(){cout << "我是懒汉式,在别人需要我的时候,我才现身。" << endl;}static Singleton_Lazy* singleton;
public:static Singleton_Lazy* getInstance(){if (NULL == singleton){mu.lock();//关闭锁if (NULL == singleton){singleton = new Singleton_Lazy;}mu.unlock();//打开锁}return singleton;}
};
Singleton_Lazy* Singleton_Lazy::singleton = NULL;
void thread01()
{for (int i = 0; i < 5; i++){cout << "thread01 working...." << endl;Singleton_Lazy *lazy1 = Singleton_Lazy::getInstance();cout << "thread01创建单例lazy1地址:" << lazy1 << endl;}
}
void thread02()
{for (int i = 0; i < 5; i++){cout << "thread02 working...." << endl;Singleton_Lazy *lazy2 = Singleton_Lazy::getInstance();cout << "thread02创建单例lazy2地址:" << lazy2 << endl;}
}int main(int argc, char *argv[])
{thread thread1(thread01);thread thread2(thread01);thread1.detach();thread2.detach();for (int i = 0; i < 5; i++){cout << "Main thread working..." << endl;Singleton_Lazy *main = Singleton_Lazy::getInstance();cout << "Main 创建单例lazy地址:" << main << endl;}return 0;
}

多线程下线程不安全的懒汉式测试

下图是将40行45行线程互斥对象操作注释的情况,发生了内存泄漏,创建了多个单例。图中字打错了。。。

多线程下线程安全的懒汉式测试

C++单例模式:单例模式遇到多线程相关推荐

  1. 单例模式中的多线程分析synchronized

    谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载. 饿汉式: Java代码   1 package com.bijia ...

  2. 单例模式在单线程多线程下的写法

    1.饿汉模式 public class HungrySingleton {private static final HungrySingleton instance = new HungrySingl ...

  3. 什么是单例模式,单例模式的作用,单例模式的用法 一站式解决单例模式

    1.什么是设计模式? 首先我们来看第一个问题什么是设计模式?在百度百科中它的定义是这样的: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. ...

  4. java设计模式之单例模式|单例模式之饿汉模式、懒汉模式、枚举方式|最详细的6种懒汉模式详解

    目录 一.单例模式 二.饿汉模式和懒汉模式 1.饿汉模式,线程安全 2.懒汉模式 懒汉模式1,线程不安全(不常用) 懒汉模式2,线程安全(不常用) 懒汉模式3,线程安全,双重校验(不常用) 懒汉模式4 ...

  5. Java学习(58)Java单例模式——单例模式的特点及适用场景

    单例模式的特点及适用场景 1. 单例模式的优点 2. 单例模式的缺点 3. 使用场景 1. 单例模式的优点 (1) 在内存中只有一个对象,节省内存空间: (2) 避免频繁的创建销毁对象,提高性能: ( ...

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

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

  7. 什么是单例模式?单例模式的举例

    什么是单例模式? Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍懒汉式单例.饿汉式单例. 特点: 1.单例类只能有一个实例.       2.单例类必须自己创建自己的唯一 ...

  8. 多个单例模式单例模式的应用

    我们在编程中需要一个单例,但不仅仅是一个单例,更多的是需要单例中的单例 即 类A为控制器,类B为实例面板 为方便找到类A,采用单例, 而类A为方便找到类B,采用单例中的单例 单例A ->单例B ...

  9. python 模块 多线程 单例_python的单例模式

    一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用 ...

  10. Java多线程之单例模式在多线程环境下的安全问题

    Java多线程之单例模式在多线程环境下的安全问题 目录: 单例模式基本概念 单线程下的单例模式 多线程下的单例模式 单例模式volatile分析 1. 单例模式基本概念 基本概念转载自:单例模式|菜鸟 ...

最新文章

  1. 漫画:什么是 “设计模式” ?
  2. scala编写排序算法
  3. Windows系统错误代码解释集合
  4. 汇编call指令详解_我也能写出雷军的的代码吗?最好的汇编语言入门教程在这里!...
  5. ICRA 2021自动驾驶相关论文汇总 | 科研党看过来,全文干货
  6. 《父亲家书》选:父亲的忙碌和欣喜
  7. android 转发短信
  8. 字符串替换方法的优劣
  9. Ansible8:Playbook循环
  10. mysql的四大线程_阿里一面就凉了:MySQL+多线程+Redis+算法+网络一个都没说明白...
  11. 133个Java面试问题列表
  12. python 实时取色器3.0(升级版)【内附源码】
  13. Multisim14.0详细安装教程图文
  14. 华为电视测试软件,简单便捷!实测教你华为智慧屏怎么样用USB安装APP
  15. linux 磁盘隔离,Linux 磁盘坏道故障修复
  16. fastdfs存储空间不足报错:错误码:28,错误信息:没有足够的存储空间
  17. 认识物联网系列——物联网架构
  18. 鸿蒙系统是手机系统还是电脑系统,鸿蒙系统能兼容手机电脑和智能设备,这是怎样实现的?...
  19. Transformer15
  20. 基于树莓派的微型气象台

热门文章

  1. java random.nextbytes_Java Random类
  2. javafx应用启动自动执行函数_JavaFx:Application start方法中的异常
  3. P1469 找筷子(python3实现)-- 10分
  4. P5708 【深基2.习2】三角形面积(python3实现)
  5. 分享一个应届生与打工人找工作的数据参考网站
  6. c语言编程调试找不到路径,VScode 调试C/C++时出现无法打开“X”: 找不到文件(file:///XXXX) 的解决办法...
  7. RTX5 | 软件定时器02 - 创建一个软件定时器(连续运行)
  8. Python笔记-使用代理切换ip爬取数据
  9. Qt工作笔记-Qt5 利用QJson从文件读取Json并解析
  10. Qt工作笔记-获取选中的文件名(lastIndexOf的使用)