论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
C# 多线程记录
C# 多线程记录
用多少眼泪才能让你相信
金牌会员
|
2023-4-23 17:53:46
|
显示全部楼层
|
阅读模式
楼主
主题
864
|
帖子
864
|
积分
2594
开发中经常遇到不同的业务访问同一个数据源,而每一个业务的执行流就是一个线程,此时线程一多就会产生多线程最容易遇到的问题——并发。
什么是并发?
举个很经典的例子:程序中我们经常要操作一些对象,尤其是内存中的数据
例如当前判断进入条件已经判断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如果消费过多,没有生产的内容,则会自身阻塞直到有新的生产内容加入,避免取空现象节约性能。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
用多少眼泪才能让你相信
金牌会员
这个人很懒什么都没写!
楼主热帖
iNeuOS工业互联网操作系统,增加搜索应 ...
安卓期末大作业——单词本APP(源码+任 ...
【Java开源数据库语言】基于SPL如何提 ...
杭州联合银行 x 袋鼠云:打造智能标签 ...
vue3+Element采用递归调用封装导航栏 ...
真正在大厂干了几年,我学会了反内卷[ ...
个人博客系统(附源码)
内网安全 - 简单域环境搭建
ssrf实战
攻防世界 new_easypwn 题解
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表