ConcurrentDictionary 是 C# 中线程安全的字典,所有操作原子执行、无需手动加锁;支持 TryAdd、AddOrUpdate、TryGetValue、GetOrAdd、TryRemove 等安全方法,性能优于 lock 包裹的普通字典。

ConcurrentDictionary 是 C# 中专为多线程场景设计的线程安全字典,它不需要额外加锁就能安全地在多个线程中读写。和普通 Dictionary 不同,它的所有常用操作(Add、Get、Update、Remove)都是原子的,且内部做了细粒度锁或无锁优化,性能比手动用 lock 包裹普通字典更好。
基本初始化和添加元素
创建实例很简单,泛型参数和普通字典一样:
var dict = new ConcurrentDictionary();
添加键值对推荐用 TryAdd,它只在键不存在时才添加,并返回是否成功:
dict.TryAdd(“key1”, 100); // 成功返回 truedict.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 组合(会竞态),改用 GetOrAdd 或 AddOrUpdate:
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的用法 – 线程安全的字典实现的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442787.html
微信扫一扫
支付宝扫一扫