单例模式:懒汉式和饿汉式

目录

懒汉模式和饿汉模式

区别

示例

懒汉模式线程不安全

懒汉模式线程安全

 懒汉模式内部静态变量线程安全

饿汉式线程安全


指的是在系统生命周期内,只产生一个实例。

懒汉模式和饿汉模式

分为懒汉式饿汉式

区别

  • 创建时机和线程安全

线程安全:多线程共享资源的过程中,线程安全通过同步机制保证各个线程正确执行。

懒汉式,比较懒,只有在用到的时候才去想我怎么才能用到,所以只有当要用到该对象时才去创建实例。线程不安全

原因:懒汉式的实例是在使用的时候才去申请,这个时候如果还没有new 出来实例,恰好又有多个线程进来访问创建对象的话,就会有问题。

解决方法:加锁。

饿汉式,害怕自己饿着,所以在一开始就准备好自己需要的东西。所以是一运行程序,就创建实例。在线程还未创建之前就已经创建出了实例,所以一定是线程安全的。

  • 执行效率

懒汉式,为保证线程安全,需要加同步锁,所以执行比饿汉式要慢一些。

  • 内存使用

懒汉式,在需要的时候才去创建实例对象,不浪费内存;

饿汉式,一开始就去创建,会占据空间,浪费内存。

示例

懒汉模式线程不安全

//懒汉模式:线程不安全
SingleCase * SingleCase::m_SingleCase = NULL;SingleCase * SingleCase::GetInstance()
{if (m_SingleCase == NULL){m_SingleCase = new SingleCase();}return m_SingleCase;
}

创建5个线程,运行结果:

构造了三次,线程不安全,适合单线程使用

注:可以将构造、析构、拷贝赋值和拷贝构造都改为private,禁止其他类进行操作。

懒汉模式线程安全

//懒汉模式,线程安全
SingleCase * SingleCase::m_SingleCase = NULL;
std::mutex SingleCase::m_mutex;
SingleCase * SingleCase::GetInstance()
{if(m_SingleCase == NULL){//双检锁//假如线程1和线程2同时到达m_mutex.lock();//此时线程1进入,判断m_SingleCase为空if (m_SingleCase == NULL){//实例化对象m_SingleCase = new SingleCase();}//结束后,释放锁,此时线程2进入,m_SingleCase已经被实例化,可以避免多次实例m_mutex.unlock();}return m_SingleCase;
}

双检锁

1.第一层if判断,完成实例化之后,之后的线程不需要进入等待,提高了效率;

2.第二层if判断,防止对象被多次实例化。

运行结果:

懒汉模式内部静态变量线程安全

//懒汉模式内部静态
SingleCase & SingleCase::GetInstance()
{static SingleCase single;return single;
}

运行结果:

饿汉式线程安全

SingleCase * SingleCase::m_SingleCase = new SingleCase();
SingleCase * SingleCase::GetInstance()
{return m_SingleCase;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21205.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bash:xxx:command not found问题,在英伟达nvidia的jetson-orin-nx上遇到的>>>解决方式之一】

【bash:xxx:command not found问题,在英伟达nvidia的jetson-orin-nx上遇到的>>>解决方式之一】 1、概述2、实验环境3、问题描述:bash:xxx:command not found问题4、我的努力第一种方式:加入指令方式第二种方式:使用echo $PATH命令查…

【Docker】docker基础使用

文章目录 docker概念什么是dockerdocker引擎迭代docker与虚拟机docker版本发展 docker基础docker架构docker Registry(镜像仓库)镜像仓库使用流程实际研发镜像仓库使用不同镜像仓库的拉取 docker常用命令镜像仓库命令docker logindocker pulldocker pushdocker searchdocker lo…

机器学习(12)--K-Means

目录 一、聚类 二、机器学习中的距离 三、sklearn中的聚类算法 四、KMeans簇内平方和和时间复杂度 五、sklearn中的KMeans 1、建立一个数据集 2、使用K-Means进行聚类操作 3、根据上面的模型绘散点图观察分类效果。 4、评估指标 4.1对于真实标签已知情况 4.2当真实标…

计算机网络基础

在介绍网络之前,先讲一个概念,一台计算机的内部本质也是一个小型网络结构,CPU、内存、外设都是通过线连接起来的,并且它们之前也有协议,一台计算机各个功能用多台计算机构建起来,用网络及链起来&#xff0c…

聊聊微服务 架构思想

用了好多年微服务架构了,我经常会反思,这个项目为啥用微服务?真的能帮我们解决一些痛点吗?这个项目有必要用微服务吗?这个项目体现出微服务的价值了吗? 我是从2017年开始入手微服务,距今已经五六…

Linux——权限

1.Linux权限的概念 Linux权限是指用于限制对文件和目录的访问的安全机制。文件和目录的权限由三个部分组成:所有者权限、同组用户权限和其他用户权限。每个部分又包括读、写、执行三种权限。这些权限决定了用户能否对文件或目录进行读、写、执行等操作。 2.Linux…

ETHERNET/IP转PROFIBUS-DP网关Profibus DP转EtherNet/IP协议转换网关

大家好,今天要给大家介绍一款非常神奇的通讯网关捷米特JM-DPM-EIP!这款产品可以将各种PROFIBUS-DP从站接入到ETHERNET/IP网络中,真是一款神奇的产品啊!你是否想过,如果没有这款产品,PROFIBUS-DP从站和ETHER…

【Linux后端服务器开发】进程控制与替换

目录 一、进程控制 1. 进程退出 2. 进程等待 2.1 阻塞等待 2.2 status位图结构 2.3 非阻塞等待 二、进程替换 1. exec*系列函数 2. 进程替换高级语言可执行程序 一、进程控制 1. 进程退出 进程退出会进入僵尸态,把自己的退出结果写入到自己的task_struct…

QT打开和保存文件对话框的操作笔记

QT打开和保存文件对话框的操作&#xff0c;需要先包含头文件QFileDialog&#xff0c;一般通过按钮实现打开和保存文件对话框的操作。 代码如下&#xff1a; #include <QDebug> #include <QFileDialog>void Form::on_pushButton_clicked() {QString fileName;fileN…

【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

尚医通开发记录(Vue3TypeScriptPiniaAxios) 一、接口地址 服务器地址:http://syt.atguigu.cn 医院接口&#xff1a;http://139.198.34.216:8201/swagger-ui.html 公共数据接口&#xff1a;http://139.198.34.216:8202/swagger-ui.html 会员接口&#xff1a;http://139.198.34…

POI下载excel通用方法

POI下载excel通用方法 最近遇到一个业务是需要下载excel&#xff0c;使用POI,这里记录一下实现过程 1、导包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency>…

Python实现将pdf,docx,xls,doc,wps链接下载并将文件保存到本地

前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps等链接。需要你使用python自动将页面上含有的这些信…