新闻中心

C# ConcurrentDictionary的用法 - 线程安全的字典实现

2025-12-07
浏览次数:
返回列表
ConcurrentDictionary 是 C# 中线程安全的字典,所有操作原子执行、无需手动加锁;支持 TryAdd、AddOrUpdate、TryGetValue、GetOrAdd、TryRemove 等安全方法,性能优于 lock 包裹的普通字典。

c# concurrentdictionary的用法 - 线程安全的字典实现

ConcurrentDictionary 是 C# 中专为多线程场景设计的线程安全字典,它不需要额外加锁就能安全地在多个线程中读写。和普通 Dictionary<tkey tvalue></tkey> 不同,它的所有常用操作(Add、Get、Update、Remove)都是原子的,且内部做了细粒度锁或无锁优化,性能比手动用 lock 包裹普通字典更好。

基本初始化和添加元素

创建实例很简单,泛型参数和普通字典一样:

var dict = new ConcurrentDictionary();

添加键值对推荐用 TryAdd,它只在键不存在时才添加,并返回是否成功:

  • dict.TryAdd("key1", 100); // 成功返回 true
  • dict.TryAdd("key1", 200); // 键已存在,不覆盖,返回 false

如果想“有则更新、无则添加”,用 AddOrUpdate

dict.AddOrUpdate("key1", 100, (k, v) => v + 10); // 第一次设100,之后每次+10

安全读取和条件更新

读取推荐用 TryGetValue,和普通字典一样,但它是线程安全的:

if (dict.TryGetValue("key1", out int value)) { Console.WriteLine(value); }

需要“先查再改”逻辑(比如计数器自增)时,避免用 Get+Set 组合(会竞态),改用 GetOrAddAddOrUpdate

网趣购物系统加强升级版 网趣购物系统加强升级版

新版本程序更新主要体现在:完美整合BBS论坛程序,用户只须注册一个帐号,即可全站通用!采用目前流行的Flash滚动切换广告 变换形式多样,受人喜爱!在原有提供的5种在线支付基础上增加北京云网支付!对留言本重新进行编排,加入留言验证码,后台有留言审核开关对购物系统的前台进行了一处安全更新。在原有文字友情链接基础上,增加LOGO友情链接功能强大的6种在线支付方式可选,自由切换。对新闻列表进行了调整,

网趣购物系统加强升级版 0 查看详情 网趣购物系统加强升级版
  • dict.GetOrAdd("counter", 0); // 不存在就设0,返回当前值
  • dict.AddOrUpdate("counter", 1, (k, v) => v + 1); // 存在则+1

遍历和删除要注意的点

遍历时 foreach 是安全的,不会抛出 InvalidOperationException(不像普通字典被修改时会报错),但注意:遍历看到的是某一时刻的快照,期间其他线程的增删不会影响当前遍历结果。

删除用 TryRemove,它返回是否成功删除:

if (dict.TryRemove("key1", out int oldValue)) { /* 删除成功,oldValue 是原值 */ }

不要用 ContainsKey + Remove 组合,这中间可能被其他线程修改,应直接用 TryRemove 原子完成。

和普通 Dictionary + lock 的对比

虽然给普通字典套一层 lock 也能线程安全,但 ConcurrentDictionary 优势明显:

  • 读操作通常无锁,高并发读性能更好
  • 写操作分段加锁(默认 31 个桶),冲突概率低
  • 提供了像 GetOrAdd 这类复合操作的原子保证,手写容易出错
  • API 设计明确表达“并发意图”,代码可读性更强

不过它内存占用略高,如果确定是单线程或仅读多写少,普通字典仍更轻量。

基本上就这些。用对方法,ConcurrentDictionary 能帮你省掉大量同步逻辑,又不容易出错。

以上就是C# ConcurrentDictionary的用法 - 线程安全的字典实现的详细内容,更多请关注其它相关文章!


# 进行了  # 珠海网站建设行情分析  # 裕华区网站推广平台官网  # seo工具方法  # 南平营销推广有哪些  # seo网上接单平台  # 安塞区门户网站建设  # 公司业务营销推广策划怎么写  # 铁岭网站建设开发优势  # 网站自助建站优化  # 上市公司网站建设报价  # 的是  # 游戏开发  # ai  # 不存在  # 加锁  # 键值  # 多线程  # 遍历  # 升级版  # 购物系统  # 代码可读性  # 键值对  # 无锁  # 内存占用  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  C++ vector二维数组定义_C++ vector of vector用法  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  J*aScript中在Map循环中检测并处理空数组元素  Mac怎么锁定备忘录_Mac备忘录加密设置教程  Golang如何安装Swagger工具_GoSwagger文档生成环境  Mac终端命令大全_Mac常用Terminal指令速查  J*aScript map 方法中处理循环元素为空数组的策略  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  新三国志曹操传110级星符试炼夏侯渊极难攻略  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  J*aScript:在map操作中高效处理空数组  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  微信网页版官方快速登录入口 微信网页版网页版账号直达  优化Django表单:提交验证失败后保留用户输入  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  Tabulator表格中精确实现日期时间排序的指南  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  J*aScript Promise链中如何正确终止后续.then执行并处理错误  海量存储:机器视觉智能化的核心基石  解决J*aScript中重复选择项的确认对话框显示问题  零跑汽车11月交付量达70327台 实现连续9个月正增长  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  Tabulator表格日期时间排序问题及自定义解决方案  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  优化大型XML文件解析:基于Python流式处理的内存高效方案  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  淘宝支付提示失败如何解决 淘宝支付流程优化方法  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  深入理解Go语言中的指针类型:以*string为例  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  快手极速版在线观看 官方网页版登录地址  深入理解Promise链:如何在catch后中断then的执行  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  星露谷物语官网入口 星露谷物语游戏官网入口  在VS Code中配置和运行Dart程序的完整步骤 

搜索