C#多线程开发-并发集合中的ConcurrentQueue

98400916f8844260a36f6c778c17f999.png

前言

大家好,我是阿辉。

上一篇博文简单介绍了C#中支持并发的数据字典,简单举例说明比较了常规集合与ConcurrentDictionary的读写速度。下来简单介绍其中一个线程安全队列ConcurrentQueue;

ConcurrentQueue

队列我们不陌生,在数据结构这门课中就有了解过,是一种先进先出的对象集合。

平时在我们需要对各项拥有先进先出的访问时,就需要使用队列来实现,当像队列里面添加元素时叫入队,移除元素时叫出队。

ConcurrentQueue是一个高效的线程安全的队列,是.Net Framework4.0 Collections.Concurrent命名空间下的一个数据结构。

实现原理:

在普通的非线程安全队列中有两种实现方式,一是使用数组实现循环队列。二是使用链表实现队列。

这两种实现方式都不适合多线程,使用数组实现的当队列存储满的话,无法继续存储,扩容困难,需要重新开辟新空间,内存开销过大。尤其是在并发的程序中,对程序性能很受影响。使用链表的实现方式,虽然消除了空间浪费但是增加了GC的压力,当入队时会分配一个新节点,出队时需要废弃,性能不高。

而对于ConcurrentQueue而言,它使用了分段存储的概念,ConcurrentQueue分配内存时以段(Segment)为单位,里面有对应的指针和初始的长度数组。

这种分配内存的实现方式不但减轻GC的压力而且调用者不需要实时显示的调用TrimToSize()来回收内存。在某段内存为空的时候,GC会主动回收。

class Program{        static int value = 0;private static  ConcurrentQueue<int> CustomQueue = new ConcurrentQueue<int>();                        //线程安全的队列static void Main(string[] args){Console.WriteLine("队列中的元素 入队  两个线程都入队:");            Thread oneThread = new Thread(new ThreadStart(AddNumber));oneThread.Start();int  firstValue=0;Thread.Sleep(10);            for (int i = 0; i < 10; i++){//入队           firstValue+=2;Console.WriteLine("队列入队元素:" + firstValue);CustomQueue.Enqueue(firstValue);}oneThread.Abort();          //终止线程Console.WriteLine("当前队列中的元素 出队:");int entity = 0;int count = CustomQueue.Count;for (int i = 0; i < count; i++){var source = CustomQueue.TryDequeue(out entity);if (source!=null){Console.WriteLine("队列出队元素:"+entity);}}Console.ReadKey();}static void AddNumber() {value+=5;Console.WriteLine("队列入队元素:" + value);CustomQueue.Enqueue(value);}}
e44c6d832d86433fdab0a22c1b6c1de1.png

以后在项目中,有关于排队进行的业务,有并发考虑和需求的,可以使用ConcurrentQueue来实现,比如接口日志异步处理、邮件、短信异步等。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

eb599038228a5cbaa4599bb1f782215b.png

往期推荐

C#多线程开发-使用并发集合

C#多线程开发-线程间通讯

C#多线程开发-处理子线程中的异常

C#多线程开发-了解C#5.0 05

C#多线程开发-任务并行库04

C#多线程开发-线程池03

C#多线程开发-线程同步02

C#多线程开发-线程基础 01

6e3e4f9fe0f71dc2a27f636315d08651.png

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

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

相关文章

一个人动情之后的表现......

1 卖家能有什么坏心思呢&#xff08;via.城与橙与澄&#xff0c;侵删&#xff09;▼2 严重怀疑传了答案▼3 别说我还真没留意到&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 领导说“辛苦了”&#xff0c;你要怎么回答▼5 哦吼&#xff08;素材来源网络&#…

线性代数第五版吉尔伯特课后答_线性代数同济第五版第六章课后习题答案!

搜集 | 整理 | 测试 | 小愉免责声明&#xff1a;以下资源或软件均来自互联网&#xff0c;仅供学习和交流使用&#xff0c;如有侵权请联系删除&#xff0c;请勿用于商业和非法途径等&#xff0c;如有法律纠纷与本人无关&#xff01;本文未经允许&#xff0c;不得转载&#xff0…

sql长整型_SQL 性能优化梳理

先简单梳理下Mysql的基本概念&#xff0c;然后分创建时和查询时这两个阶段的优化展开。1 基本概念简述1.1 逻辑架构第一层&#xff1a;客户端通过连接服务&#xff0c;将要执行的sql指令传输过来第二层&#xff1a;服务器解析并优化sql&#xff0c;生成最终的执行计划并执行第三…

网络的东西南北

前一陣子連續出差, 加上許多的內部會議, 搞的差點想去撞牆把自己搞昏之後就可以休息一下. 但是家中還有嗷嗷待哺的嬰兒需要爸爸幫他洗屁屁, 所以只有咬牙繼續撐下去. 不過這兩個月來, 不過在公司內部還是外部, 我都收到一樣類似的老問題那就是&#xff1a;&#xff08;認識我的…

K8s 中使用 cert-manager 申请免费 Https 证书

K8s 中使用 cert-manager 申请免费 Https 证书Intro最近在尝试将自己的应用从自己用 kind 部署的一个 k8s 集群迁移到 Azure 的 AKS 上&#xff0c;其中一个问题就是 https 证书&#xff0c;原来的 k8s 集群是放在 nginx 后端的并没有直接管理 https 证书&#xff0c;https 证书…

为什么要学数学?因为它真的没用啊!

全世界只有3.14 % 的人关注了爆炸吧知识数学之用无用之用有一天&#xff0c;表妹过来问了我两个问题&#xff1a;数学有什么用&#xff1f;那些深奥的公式对于普通人有什么意义&#xff1f;相信大多数人都有这个疑问&#xff0c;但总是找不到一个标准答案。问老师&#xff0c;他…

UI设计教程-界面设计构图

九宫格构图&#xff0c;圆心点放射形构图&#xff0c;三角形构图&#xff0c;SF字形构图。 1.九宫格网格构图 这种版式主要运用在分类为主的一级页面&#xff0c;起到功能分类的作用。 通常在界面设计中&#xff0c;我们会利用网格在界面进行布局&#xff0c;根据水平方向和垂直…

Android之最好理解的Binder机制

转载&#xff1a;http://weishu.me/2016/01/12/binder-index-for-newer/ Binder学习指南 发表于 2016-01-12 | 92条评论 | 34011次阅读毫不夸张地说&#xff0c;Binder是Android系统中最重要的特性之一&#xff1b;正如其名“粘合剂”所喻&#xff0c;它是系统间各个组件…

sql年月日24小时制_24小时制的「无码」真人秀,令人叫绝

几年前&#xff0c;我们总说互联网给世界带来了巨大的变化。到了现在&#xff0c;没想到自媒体的发展居然也能改变生活。但大家知道吗&#xff0c;其实早在20年前&#xff0c;美国那边就曾因“直播”掀起过不小的风浪——还是尺度挺大的那种。以至于毒师看过以后&#xff0c;整…

HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...

背景HangFire有个很奇怪的现象&#xff0c;就是即使你设置的循环作业是一天一次&#xff0c;但是每次作业执行很长时间&#xff0c;我们假设是1小时&#xff0c;那么差不多在开始执行之后的30分钟之后&#xff0c;如果还在执行job,系统就会自动帮你重新开启了新的job执行。也就…

linux之查看文件大小、文件夹的大小和分区磁盘速度

1 查看文件大小 查看文件大小的命令 ls -l filename 比如: 注意这个 1243870 是 单位是B 2 查看文件夹的大小 查看文件夹的大小,也就是查看文件夹下所有文件的大小总和 先进入这个目录: cd FoldeName 命令如下: du -sh 3 查看分区磁盘速度 命令如下:

再谈“开源软件供应链安全”

| 作者&#xff1a;庄表伟| 编辑&#xff1a;刘雪洁| 设计&#xff1a;周颖| 责编&#xff1a;王玥敏缘起之前写过一篇文章《我所理解的开源软件供应链安全》&#xff0c;当时的情况&#xff0c;还没有出现一些值得探讨的&#xff0c;堪称紧迫的热点事件&#xff0c;所以我也仅…

python 测试框架

2019独角兽企业重金招聘Python工程师标准>>> # -*- encodeing:utf-8 -*- import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.size 4 def tearDown(self): self.size 0 def testSize(self): self.assertEqual(self.size, 4) def su…

从抛硬币试验看随机游走定义的基本概念错误

全世界只有3.14 % 的人关注了爆炸吧知识随机游走&#xff08;Random Walk&#xff09;是《随机过程》教科书中用于描述动态随机现象的一种基本随机过程&#xff0c;许多重要的随机过程都可由它派生出来&#xff0c;其理论不仅在随机过程中占有相当重要的地位&#xff0c;而且也…

正则表达式学习手册

效果图<ignore_js_op style"word-wrap: break-word;">详细说明&#xff1a;http://java.662p.com/thread-3932-1-1.html转载于:https://www.cnblogs.com/huasili/p/4152584.html

excel下划线转驼峰公式

最近为了省事&#xff0c;决定从excel将表结构生成jquery.datatable的json对象结构&#xff0c;其中要把下划线转驼峰&#xff0c;如下&#xff1a; LEFT(C251,1)&MID(SUBSTITUTE(PROPER(C251),"_",""),2,100)

NSCoding和NSCopy

为什么80%的码农都做不了架构师&#xff1f;>>> 很多时候我们都需要将对象序列化&#xff0c;比如将一个对象存入到NSUserDefault 里面去的时候&#xff0c;由于NSUserDefault支持存入的类型有限制&#xff0c;所以很多时候我们需要将NSObject类型的对象转换成NSDa…