当前位置: 首页 > article >正文

【线程安全的单例模式和STL是否是线程安全/智能指针是否是线程安全】

文章目录

  • 一、单例模式的特点
  • 二、饿汉模式实现单例
  • 三、懒汉模式实现单例
  • 四、STL线程安全吗?
  • 五、智能指针线程安全吗?


一、单例模式的特点

一个类,只应该实例化了一个对象,就是单例。

二、饿汉模式实现单例

举个饿汉模式的例子:洗碗,一个人吃碗饭之后,他马上洗碗,下次吃饭的时候就可以直接拿起碗吃饭了。这就是饿汉模式。
懒汉模式是:一个人吃完饭之后,他先不洗碗,下次吃饭的时候再洗碗,这就是懒汉模式。
懒汉模式的核心特点是:延迟加载。

饿汉模式实现单例:
template<class T>
class Singleton
{
private:static T inst;public:static T* GetInstance(){return &inst;}
};

通过SingleTon类实例化的对象只能拥有一个。

三、懒汉模式实现单例

懒汉模式具体是什么已经介绍过了。
下面用代码实现懒汉模式

懒汉模式实现单例
template<class T>
class Singleton
{
private:static T* inst;public:static T* GetInstance(){if(inst == nullptr)inst  = new T();return inst;}
};

但是这样的懒汉模式存在线程安全,假如有两个线程同时进入GetInstance函数中new T()呢?
这样就会存在两个inst指针指向的对象了, 就不再是单例了。

所以需要加锁保证线程安全。
下面是线程安全版本的单例模式

template <class T>
class Singleton
{
private:static std::mutex lock;volatile static T* inst;  //设置volatile关键字的目的是防止被编译器优化
public:static T* GetInstance(){lock.lock();if(inst == nullptr)		//判断的本质也是再访问临界资源,所以要在加锁之后inst = new T();lock.unlock();return inst;}

这样解决了线程并发问题,但是这样假如有大量线程同时进入该函数时,会并发竞争锁,会造成性能低下,极端情况下可能出现卡顿现象。
因为不管有没有实例化T对象,都会进行锁竞争,这是不太合理的。

正确的应该是:如果没有实例化T对象,先申请锁对T对象new一个出来。
如果有了T对象,直接返回即可。
下面是改正后的代码:

template <class T>
class Singleton
{
private:static std::mutex lock;volatile static T* inst;  //设置volatile关键字的目的是防止被编译器优化
public:static T* GetInstance(){if(inst == nullptr)   //双重判定空指针, 降低锁冲突的概率, 提高性能{lock.lock();if(inst == nullptr)   //判断的本质也是再访问临界资源,所以要在加锁之后inst = new T();lock.unlock();}return inst;}};

这样实现懒汉模式的单例模式,解决了线程安全+性能低下的问题。

四、STL线程安全吗?

不是
原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响.而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶).
因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全

五、智能指针线程安全吗?

对于 unique_ptr, 由于只是在当前代码块范围内生效, 因此不涉及线程安全问题
对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题.但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数

相关文章:

【线程安全的单例模式和STL是否是线程安全/智能指针是否是线程安全】

文章目录 一、单例模式的特点二、饿汉模式实现单例三、懒汉模式实现单例四、STL线程安全吗&#xff1f;五、智能指针线程安全吗&#xff1f; 一、单例模式的特点 一个类&#xff0c;只应该实例化了一个对象&#xff0c;就是单例。 二、饿汉模式实现单例 举个饿汉模式的例子&…...

C++11 标准库 `find` 与 `find_if` 详解

一、std::find 函数 功能&#xff1a;在指定范围内查找特定值&#xff0c;返回第一个匹配元素的迭代器&#xff1b;若未找到&#xff0c;返回 end() 迭代器。 原型&#xff1a; template <class InputIt, class T> InputIt find(InputIt first, InputIt last, const T&…...

每日总结3.24

第十届蓝桥杯大赛软件赛省赛C/C 大学 B 组 183.完全二叉树的权值&#xff08;找规律&#xff0c;临界值&#xff09; #include <bits/stdc.h> using namespace std; int a[1000005]; int main() { int m;int d; cin>>m; int sum;int maxn0; for(int i1;i&…...

Redis分布式寻址算法

分布式寻址算法是分布式系统中用于确定数据应该存储在哪个节点的算法。这些算法对于实现高效的数据存取、负载均衡和系统扩展性至关重要。以下是几种常见的分布式寻址算法的解释&#xff1a; 1. Hash 算法 原理&#xff1a;通过哈希函数将数据的键&#xff08;Key&#xff09…...

kotlin init执行顺序

一 代码 kotlin: package test.fclass Test1 { }class TestInit(s: String, i: Int) {var name: String? nullvar age 0private var a :Int 1init {this.name sthis.age iprintln("init代码块: $name, $age")}}转成java // Test1.java package test.f;import…...

详解Spark executor

在 Apache Spark 中&#xff0c;Executor&#xff08;执行器&#xff09; 是运行在集群工作节点&#xff08;Worker Node&#xff09;上的进程&#xff0c;负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一&#xff0c;直接决定了任务的并行度和资源利用…...

单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结

RAM 与 内存 RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 和 内存 这两个术语通常是 同义词&#xff0c;即 内存 常常指的就是 RAM。 1. RAM&#xff08;内存&#xff09; 定义&#xff1a;RAM 是计算机中的 主存储器&#xff0c;用于临时存…...

NVIDIA V100显卡支持Tensor Core技术,而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理

NVIDIA V100显卡支持Tensor Core技术&#xff0c;而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理。 要利用Tensor Core加速&#xff0c;需要满足以下一些条件&#xff1a; 软件支持&#xff1a;所使用的深度学习框架&#xff08;如PyTorch、TensorFlo…...

《深度剖析:BERT与GPT——自然语言处理架构的璀璨双星》

在自然语言处理&#xff08;NLP&#xff09;的广袤星空中&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;与GPT&#xff08;Generative Pretrained Transformer&#xff09;系列模型宛如两颗最为耀眼的星辰&#xff0c;引领…...

《AI大模型趣味实战 》第7集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 1

AI大模型趣味实战 第7集&#xff1a;多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 1 摘要 在信息爆炸的时代&#xff0c;如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过Python和Flask框架&#xff0c;结合大模型的强大…...

JS 算术运算符

JavaScript 算术运算符 一、基础运算符及行为特性 1. 四则运算 加法 + 数值相加:5 + 3 → 8字符串拼接(隐式类型转换):"5" + 3 → "53"混合类型优先级:1 + true → 2(true转1)减法 -、乘法 *、除法 / 纯数值运算:5 - "2" → 3(字符串转…...

基于Spring Boot的健身房管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

WSL Linux 子系统download

WSL各Linux 子系统下载 WSL Linux 最新下载 微软应用商店 | Microsoft StoreWSL Linux 历史版下载复制应用商店Linux地址到转换下载地址https://store.rg-adguard.net/ Version百度网盘离线下载OracleLinux提取...

Qt中通过QLabel实时显示图像

Qt中的QLabel控件用于显示文本或图像&#xff0c;不提供用户交互功能。以下测试代码用于从内置摄像头获取图像并实时显示&#xff1a; Widgets_Test.h&#xff1a; class Widgets_Test : public QMainWindow {Q_OBJECTpublic:Widgets_Test(QWidget *parent nullptr);~Widgets…...

Redis GEO 命令详解:轻松实现“附近的人“功能

目录 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令详解 命令应用示例 添加地点信息 查询两地距离 查询附近的城市 实现"查找附近的人"功能 功能需求与实现思路 基本需求 实现思路 命令实现方案 存储用户位置 查询附近的用户 Java代码实…...

基于springboot的校园资料分享平台(048)

摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创建了一个计算机管理校园资料分享平台的方案…...

模板方法设计模式在事件处理中的应用

在软件设计中&#xff0c;设计模式提供了一种通用的解决方案来应对特定类型的问题。本文将介绍模板方法设计模式&#xff0c;并展示如何在事件处理场景中应用这一模式。我们将以 AbstractEventHandler 类为例&#xff0c;探讨其如何通过模板方法模式来实现灵活的事件处理机制。…...

CS2 demo manager 安装

CS2DM CS Demo Managerhttps://cs-demo-manager.com/PostgreSQL&#xff08;CS2DM需要17以上&#xff09; EDB: Open-Source, Enterprise Postgres Database Managementhttps://www.enterprisedb.com/downloads/postgres-postgresql-downloads 新CS2dm现在打开是这样的&…...

奇怪的异形选项卡样式、弧形边框选项卡

<template><div :class"$options.name"><div class"tab">默认选项卡</div><div class"tab" active>选中选项卡</div><el-divider /><el-tabs v-model"tabActiveName" tab-click"(t…...

elasticsearch 通用笔记

文章目录 一、前言二、内容说明1、目录简介2、本文例子前提内容 三、操作内容1、设置ES为服务2、查看健康度参数解析 3、索引相关查询3.1、查询指定索引内容3.1.1、匹配查询3.1.2、精确匹配&#xff08;不尝试分词&#xff09;3.1.3、范围查询3.1.4、id查询3.1.5、通配符及前缀…...

Java 24 学习

一、Java 24的核心新功能 1、语言特性增强 模式匹配与原始类型支持&#xff08;JEP 488&#xff09;&#xff1a;允许在instanceof和switch中使用原始类型&#xff0c;简化模式匹配代码&#xff0c;尤其适用于AI推理场景912。 灵活的构造函数体&#xff08;JEP 492&#xff…...

【前端 vue 或者麦克风,智能语音识别和播放功能】

前端 vue 或者麦克风&#xff0c;智能语音识别和播放功能 1. 终端安装 npm install recordrtc2.引入 import RecordRTC from recordrtc3.html&#xff08;根据自己业务更改&#xff09; <div class"Page"><el-form ref"mainFormRef" class&qu…...

3.23 代码随想录第二十四天打卡

122.买卖股票的最佳时机II (1)题目描述: (2)解题思路: class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for (int i 1; i < prices.size(); i) {result max(prices[i] - prices[i - 1], 0);}return result;} }; (3)总结: 1.假…...

Python---数据分析(Pandas十一:二维数组DataFrame统计计算二)

1、std 用于计算 DataFrame 中数值的标准差。 DataFrame.std(axis0, skipnaTrue, ddof1, numeric_onlyFalse, **kwargs) 描述说明axis {0 或 ‘index’, 1 或 ‘columns’, None}, 默认为 0。这个参数决定了计算标准差是在哪个轴上进行&#xff1a; 如果 axis0 或 axisindex&…...

OpenCV平滑处理:图像去噪与模糊技术详解

引言 在图像处理中&#xff0c;噪声是一个常见的问题&#xff0c;它可能来自于图像采集设备、传输过程或环境干扰。为了去除噪声并改善图像质量&#xff0c;平滑处理&#xff08;Smoothing&#xff09;是一种常用的技术。OpenCV提供了多种平滑处理方法&#xff0c;包括均值滤波…...

【LeetCode】大厂面试算法真题回忆(36)--相同数字的积木游戏

题目描述 小华和小薇一起通过玩积木游戏学习数学。他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小薇找到这排积木中数字相同且所处位置最远的2块积木块&#xff0c;计算他们的距离…...

使用Python将视频转化为gif

使用Python将视频转化为gif 一、前言二、准备三、测试 一、前言 最近想把喜欢的视频片段作成gif&#xff0c;就试着用Python做了下&#xff0c;感觉效果还行&#xff0c;这里做个记录。 二、准备 先下载安装对应的库&#xff0c;命令如下&#xff1a; pip install moviepy …...

HTTP长连接与短连接的前世今生

HTTP长连接与短连接的前世今生 大家好&#xff01;作为一名在互联网摸爬滚打多年的开发者&#xff0c;今天想跟大家聊聊HTTP中的长连接和短连接这个话题。 记得我刚入行时&#xff0c;对这些概念一头雾水&#xff0c;希望这篇文章能帮助新入行的朋友少走些弯路。 什么是HTTP…...

批量将 PPT 文档中的图片提取到文件夹

在 PPT 文档中我们可以插入很多的图片来丰富我们的幻灯片页面&#xff0c;但是当我们需要将 PPT 幻灯片中的图片提取出来的时候&#xff0c;会非常的麻烦&#xff0c;因为我们需要打开 PPT 然后将图片保存起来。会非常的耗费我们的时间和精力。今天给大家介绍的就是一种批量将 …...

yolo目标检测算法在DJI上的研究分析(大纲)

yolo目标检测算法在DJI上的研究分析 面向边缘计算的实时目标检测系统设计与部署 第一章 绪论 1.1 研究背景与意义 目标检测技术需求&#xff1a; DJI设备&#xff08;如无人机、摄像头&#xff09;在安防、巡检、农业等场景中的广泛应用现有YOLO算法在高分辨率图像或资源受限…...