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

74612e21410848ac439d394cd11734c8.png

前言

大家好,我是阿辉。

在C#语言中当需要处理并发的场景时,就需要程序员使用最合理的数据结构。那么哪些数据结构是支持和可以在并行计算中被使用的呢。

首先这些数据结构具备可伸缩性,尽可能地避免锁(会造成多个线程的等待,防止资源竞争),同时还能提供线程安全的访问。

在.NET Framework4.0中引入了System.Collections.Concurrent命名空间,其中就包含几个数据结构。

  • ConcurrentQueus

  • ConcurrentDictionary

  • ConcurrentStack

  • ConcurrentBag

  • BlockingCollect

那么接下来,我们来看看这些支持并行计算的数据结构到底应该如何使用!

ConcurrentQueus

该集合使用了原子的比较和交换(CAS),以及SpinWait来保持线程安全。

它实现了一个先进先出(First In First Out简称FIFO)的集合。元素的出队列和加入队列的顺序是一致的。

Enqueus(): 向队列中加入元素。

TryDequeus(): 取出队列中的第一个元素,此时队里无此元素。

TryPeek(): 得到第一个元素但并不从队列中删除该元素。

ConcurrentStack

此集合在实现层也没有加入任何锁,只采用了CAS操作。

它是一个后进后出(Last In First Out,简称LIFO)集合,最近添加的元素先出去(类比为栈)。

Push()和PushRange(): 给该集合添加元素。

TryPop()和TryPopRange(): 从该集合获取元素。

TryPeek(): 检查元素。

ConcurrentBag

该集合是一个支持重复元素的无序集合,专门针对下面多个线程工作时,集合进行了优化。每个线程产生和消费自己的任务,极少与其他线程的任何交互(若需要使用交互,则必须使用锁操作)。

Add(): 添加元素。

TryPeek(): 检查元素。

TryTake(): 获取元素。

ConcurrentDictionary

是一个线程安全的字典集合。其中读操作无需使用锁,写操作需要使用锁。

该并发字典使用多个锁,在字典之上实现一个细粒度的锁模型。其中使用concurrencyLevel可以在构造函数中定义锁的数量,那么说意味着预估的线程数量将并发地更新该字典。

由于并发字典使用锁,所以一些操作需要获取该字典中的所有锁。若是在编程过程中,没有必要则不要调用下面方法:Count,IsEmpty,Keys,Values,CopyTo及ToArray。

BlockingCollection

该集合是对泛型接口IProducerConsumerCollection实现的一个高级封装。其中有很多管道场景,即当你有一些操作需要使用之前计算的结果。

BlockingCollection支持如下功能:

  • 分块

  • 调整内部集合容量

  • 取消集合操作

  • 从多个块集合中获取元素

Demo

在单线程的环境中使用通用字典与使用通用字典的性能。

使用ConcurrentDictionary

class Program{const string Item = "";public static string CurrentItem;static void Main(string[] args){var concurrentDicrionary=new ConcurrentDictionary<int ,string>();var dictionary=new Dictionary<int ,string>();var sw = new Stopwatch();sw.Start();for (int i = 0; i < 1000000; i++){lock(dictionary){dictionary[i]=Item;}}sw.Stop();Console.WriteLine("写dictionary的时间"+sw.Elapsed);sw.Restart();for (int i = 0; i < 1000000; i++){concurrentDicrionary[i] = Item;}sw.Stop();Console.WriteLine("写并发集合concurrentDicrionary的时间:" + sw.Elapsed);sw.Restart();for (int i = 0; i < 1000000; i++){lock(dictionary){CurrentItem = dictionary[i];}}sw.Stop();Console.WriteLine("读dictionary的时间" + sw.Elapsed);sw.Restart();for (int i = 0; i < 1000000; i++){CurrentItem=concurrentDicrionary[i];}sw.Stop();Console.WriteLine("读并发集合concurrentDicrionary的时间:" + sw.Elapsed);Console.ReadKey();}}
d9caf48655d730e881325172dfe6097c.png

可以发现使用ConcurrentDictionary写操作比使用锁的通用字典要慢很多,而读操作则更快些。因此如果对字典需要大量的线程安全的读操作,则ConcurrentDictionary是更好的选择。

小寄语

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

原创不易,给个关注。

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

a7872f9ddd32485e0a75c98339123424.png

往期推荐

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

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

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

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

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

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

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

a6772f628bb3f94697b460959d621506.png

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

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

相关文章

Android之用sharedUserId来实现不同应用(APK)数据共享

android:sharedUserId 当APK安装的时候&#xff0c;userid这个标志就会产生。APK在设备上的整个生命周期中&#xff0c;这个ID不再改变。不同设备上同一个应用包可能有不同的userid&#xff0c;重要的是在给定的设备上&#xff0c;每个应用包有自己独立的userid。 userid的特点…

windows 下安装wamp环境

一直以来都是学习在Linux下安装lanmp环境&#xff0c;在Windows下都是用的集成工具比如appserv现在来安装Windows版本的lamp都是从官网下载的资源在Windows下以后还会编辑更多的东西。我的文章都会以后都有更新&#xff0c;因为有时候有点想法&#xff0c;如果不实践的话会忘记…

python编程发展_编程的发展史及Python简介

一.编程语言演变史编程语言分为三类&#xff0c;分别是机器语言&#xff0c;汇编语言和高级程序语言。1.机器语言&#xff1a;用0和1表示二进制跟计算机进行直接的沟通交流&#xff0c;对硬件进行直接操作。2.汇编语言&#xff1a;用简单的英文标签来表示二进制数&#xff0c;对…

iOS ShareSDK 使用

流量精灵软件中&#xff0c;也在大部分地方使用到了shareSDK 这个三方开源库。具体的有两种需求 a、弹出所有分享模块 b、只弹出指定的平台&#xff1a;如微信朋友圈和QQ 。 配置方法&#xff0c;三方库中也很详细&#xff0c;这里我只有写出自出自己代码实现的部分 这里只写自…

应用环境下的TIME_WAIT和CLOSE_WAIT

转载自&#xff1a;http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常&#xff0c;具体过程如下&#xff1a;http://blog.csdn.net/shootyou/article/details/6615051里头的分析过程有提到&#xff0c;通过查看服务器网…

当社恐和社恐相亲时,场面会有多尴尬?

1 俄国人真实在&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 alone和lonely的区别&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 她可能怕她男朋友伤害到别人&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 真正的笋到家了&#xff08;…

FlexPod上安装vSphere 5.5配置中的排错(1)

delxu原创文档&#xff0c;转发请一定要标记本文出处和原文URL。 这些日子在进行FlexPod上的vSphere 5.5的安装和配置&#xff0c;过程中遇到一些故障、困难&#xff0c;都一一解决了。觉得有必要和大家分享一下。可能会有好多篇&#xff0c;也可能和以前一样&#xff0c;虎头蛇…

Android插件化开发之动态加载三个关键问题详解

本文摘选自任玉刚著《Android开发艺术探索》&#xff0c;介绍了Android插件化技术的原理和三个关键问题&#xff0c;并给出了作者自己发起的开源插件化框架。 动态加载技术&#xff08;也叫插件化技术&#xff09;在技术驱动型的公司中扮演着相当重要的角色&#xff0c;当项目越…

python正十三边形_一起学python-opencv十三(直方图反向投影和模板匹配)

2D直方图https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_histograms/py_2d_histogram/py_2d_histogram.html#twod-histogram为什么只考虑h,s就够了呢&#xff1f;因为其实亮度是很容易受外界影响的&#xff0c;我们认为一个颜色的本质特…

Laravel 学习笔记之 Query Builder 源码解析(下)

说明&#xff1a;本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程。实际上&#xff0c;上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类&#xff0c;这个类含有三个主要的武器&#xff1a;MySqlConnection, MySqlGrammar, MySqlProcess…

退出Activity(转)

退出Activity如何退出Activity&#xff1f;如何安全退出已调用多个Activity的Application&#xff1f; 退出activity 直接调用 finish () 方法 . //用户点击back键 就是退出一个activity 退出activity 会执行 onDestroy()方法 . 1、抛异常强制退出&#xff1a; 该方法通过抛异…

更方便地模拟 Http 响应

更方便地 Mock Http ResponseIntro在我们的业务代码中往往会有很多调用内部其他 team 或者是第三方的一些服务&#xff0c;在编写单元测试代码时&#xff0c;往往需要 Mock Http Response 来模拟更好可能的返回结果&#xff0c;我封装了一个简单的 Http Handler 来简化 Mock 过…

xmanager远程桌面控制linux

更多博文请关注&#xff1a;没有伞的孩子必须努力奔跑(www.xuchanggang.cn)一、在linux端配置1.默认&#xff0c;你安装好系统gdm已经安装&#xff0c;不做解释2.配置gdm(1).修改 /etc/gdm/custom.conf 文件&#xff0c;替换为下面内容[daemon] RemoteGreeter/usr/libexec/gdmg…

男人的快乐可以多简单?

1 说不出哪里像但是非常像&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 质量不错&#xff0c;就是风大不建议穿&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 谈恋爱的要求&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 当给狗狗看了捕…

Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤

第一步、先制做一个有我们需要的图片资源的APK 如下图&#xff0c;这里有个about_log.png,我们需要生成apk文件。生成的apk文件如果你不到项目的文件夹里面去取apk&#xff0c;想通过命令放到手机里面去可以快速用下面命令 1&#xff09;、在手机里面通过包名找到apk路径&…

python框架django文档_Django基础——Django框架介绍及模板语言

Django框架&#xff0c;我们只需要关心二点&#xff1a;1.根据用户访问不同的路径执行不同的函数2.从HTML读取出内容,并且完成字符串的替换而socket通信不需要我们自己写&#xff1b;新建Django项目命令行创建:django-admin startproject mysitepycharm创建:1. File --> New…

Mybatis常用总结:参数,返回,执行sql,include等

1.参数注入1.1用#{0},#{1}的形式&#xff0c;0代表第一个参数&#xff0c;1代表第二个参数  public List<RecordVo> queryList(String workerId, Integer topNum); <select id"queryList" resultType"com.demo.RecordVo">     SELECT ID…

下拉框控件、列表控件、ComboBox

delphi 列表组件ComboBox TComboBox组件的重要属性CharCase--------此属性用于设置编辑框内文字的大小写DropDownCount---此属性用于设置当用户下拉组合框时不需要加滚动条就能显示的项的个数DroppedDown-----如组合框当前被下拉&#xff0c;此属性返回TrueItemHeight------此属…

ManualResetEvent实现线程的暂停与恢复

背景前些天遇到一个需求&#xff0c;在没有第三方源码的情况下&#xff0c;刷新一个第三方UI&#xff0c;并且拦截到其ajax请求的返回结果。当结果为AVALIABLE的时候&#xff0c;停止刷新并语音提示&#xff0c;否则继续刷新。分析这个需求&#xff0c;发现需要控制一个刷新循环…

java反射异常之java.lang.NoSuchFieldException: school

今天调用下面的代码的时候 Field schoolField studentClass.getField("school");schoolField.setAccessible(true);schoolField.set(null, "中南林科大");System.out.print("school:" student.getSchool()); 爆出java.lang.NoSuchFieldExcept…