0

0

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

月夜之吻

月夜之吻

发布时间:2025-12-07 11:07:02

|

294人浏览过

|

来源于php中文网

原创

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

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

ConcurrentDictionary 是 C# 中专为多线程场景设计的线程安全字典,它不需要额外加锁就能安全地在多个线程中读写。和普通 Dictionary 不同,它的所有常用操作(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种在线支付方式可选,自由切换。对新闻列表进行了调整,

下载
  • 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 能帮你省掉大量同步逻辑,又不容易出错。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

746

2023.08.22

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

42

2025.12.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号