首页 > 编程语言 >C# 多线程记录

C# 多线程记录

时间:2023-04-23 15:55:51浏览次数:34  
标签:加锁 记录 C# 并发 线程 BlockingCollection sleep 多线程

 开发中经常遇到不同的业务访问同一个数据源,而每一个业务的执行流就是一个线程,此时线程一多就会产生多线程最容易遇到的问题——并发。

什么是并发?

        举个很经典的例子:程序中我们经常要操作一些对象,尤其是内存中的数据

        

 

        例如当前判断进入条件已经判断newModel不为空,sleep(10)称为比较耗时的运算,在此期间如果别的地方把newModel置空,等到sleep(10)结束就会产生异常,这里sleep只是一个放大的时间,实际业务中这种运算绝大部分都是毫秒甚至微妙级别的,不进行代码review很难发现这方面的问题,从而导致项目产生各种莫名其妙异常。

怎么解决并发?

        关于并发解决网上这方面教程也比较多,主要为加锁,设计模式-单例模式这两种结合解决并发问题。这里就暂时不详细举例了。内存中的集合数据可能比较常见的保存方式就是list,array,queue等,但是这些都是线程非安全的,在多线程操作中需要手动加锁,代码庞大之后,就有概率在一些地方丢锁或者重复加锁,更严重甚至产生死锁。

        既然有线程非安全,那必然有线程安全,线程安全集合有主要有五种(ConcurrentQueue,ConcurrentStack,ConcurrentBag,BlockingCollection,ConcurrentDictionary),他们在一定程度上使用了无锁技术和内存屏障比正常使用互斥锁有一定性能提升。这里说明一下BlockingCollection。

        BlockingCollection类似阻塞队列,其最舒服的地方位于它是实现了生产者——消费者的关系,比ConcurrentQueue好太多,同时他还支持foreach与限制最大容量。

        BlockingCollection.Add 如果生产超过指定容量BlockingCollection会自身阻塞停止生产

        BlockingCollection.Take如果消费过多,没有生产的内容,则会自身阻塞直到有新的生产内容加入,避免取空现象节约性能。


标签:加锁,记录,C#,并发,线程,BlockingCollection,sleep,多线程
From: https://www.cnblogs.com/Zjl-NanKe/p/17346766.html

相关文章

  • jquery validate 例子延伸--如何使用classname而不是name来验证
    可用例子一:底下内容摘自链接:http://jsfiddle.net/Nbcj9/ 可用例子二:底下内容摘自:http://jsfiddle.net/rq5ra/1/<formid="myform"><inputtype="text"name="field_1"class="num"/><br/><inputtype="te......
  • 安装centos79的笔记
    一、安装下载centos79最终全集版的iso文件:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/一般建议下载那个CentOS-7-x86_64-Everything-2207-02.iso,一代经典的centos7,出到的最后一个版本。这里进行的是在vmwareworkstation16.1中安装,2C4G40G的简朴配置......
  • Linux环境下安装VSCode
    方式一:将下载的安装包解压后直接进入VSCode/bin/目录,双击目录中的名为code的shell脚本,即可启动VSCode。方式二:1.下载VSCode访问VisualStudioCode官网https://code.visualstudio.com/docs?dv=linux64下载64位code-stable-x64-1658162259.tar.gz安装包。2.解压tar-zxvf c......
  • LightOJ1007---Mathematically Hard (欧拉函数)
    Mathematicallysomeproblemslookhard.Butwiththehelpofthecomputer,someproblemscanbeeasilysolvable.Inthisproblem,youwillbegiventwointegersaandb.Youhavetofindthesummationofthescoresofthenumbersfromatob(inclusive).T......
  • 首次发刊!Coremail管理员社区2023年Q1季刊发布
    4月21日,Coremail安全邮件城市沙龙在北京正式开展,此次沙龙活动的主题为“践行教育信创,护航邮件安全”。广东盈世计算机科技有限公司服务副总裁、ICANNUA大使吴秀诚在活动上正式发布《Coremail管理员社区2023年Q1季刊》。Coremail管理员社区Coremail管理社区属于云服务板块之一,由Cor......
  • cpu居然不下,排查诊断详解
    客户端登录服务器,使用非常卡顿,查看服务器使用情况有进程占用cpu非常严重查看进程所在目录[root@176-18-0-10~]#pwdx12681268:/usr/local/games/.cache查看病毒目录和执行文件内容[root@176-10-0-10~]#ls/usr/local/games/.cacheah32h64runss32stak3stakce......
  • VSCODE下载提速
    1.访问VScode官方网站:VisualStudioCode-CodeEditing.Redefined2.找到适合自己的版本;3.点击自动进入下载,显示下载速度很慢很慢,进入下载页面,复制下载地址;4.打开浏览器,去新建一个下载;以下为复制出的下载地址例子,需要复制自己的地址:https://az764295.vo.msecnd.net/stable......
  • uniapp directive 在原生 wgt 包不生效 uniapp directive 不生效
    需求根据权限编码禁用按钮阻止当前dom绑定的点击事件,禁用状态(opacity半透明??或者display:none??)尝试开发环境用Chrome跑,一切正常,构建打包后去真机跑,按钮没控制住(用HBX-发行-原生应用app制作wgt包)开发环境:HBX:3.7.9系统:MacOS:13.0.1(Intel)通过direct......
  • 盘点一款Python发包收包利器——scapy
    今日鸡汤潮平两岸阔,风正一帆悬。    大家好,我是黄伟。今天跟大家讲的是Python用于发送接受网络数据包的模块-------scapy。前言众所周知,我们每天上网都会有很多数据包需要发送,然后处理在接受在发送,这样一个循环往复的过程,这里就显示了很多数据包的发送接收数据。那么,什么是包......
  • 第14届蓝桥杯C++B组省赛题解(更新中)
    目录A.日期统计题目内容思路代码答案B.01串的熵题目内容思路代码答案C.冶炼金属题目内容输入格式输出格式输入样例输出样例思路代码A.日期统计题目内容小蓝现在有一个长度为100的数组,数组中的每个元素的值都在0到9的范围之内。数组中的元素从左至右如下所示:5686......