【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

ConcurrentDictionary:.NET 4.0 中新的线程安全的哈希表

  • 2010-01-31
  • 本文字数:1028 字

    阅读完需:约 3 分钟

ConcurrentDictionary 是.NET 4.0 中在并行和并发编程方面显著增强的基石。但是在对其进行深入研究之前,让我们来回顾一下在.NET 之前版本中存在的问题。

.NET 中哈希表的第一个版本是 System.Collections.Hashtable。尽管它并非是线程安全的,但在理论上你可以通过简单地调用 Hashtable.Synchronized 来得到线程安全的封装器。不幸的是,由于这个封装器所使用的方式,它并不是真正线程安全的,

比方说,你想要检查一个键值是否存在于集合中。如果不存在,那么你就想要执行一个不会重复的操作,在那里会将结果保存。即使 ContainsKey 和 set_Item 二者都分别是线程安全的,也没有一种方式能够直接对它们进行组合。作为替代的方法,你需要采用 SyncRoot 上的锁,这会推翻你在前面请求同步版本的所有理由。

当.NET 2.0 引入泛型和 System.Collections.Generic.Dictionary 的时候,微软还是没有解决这个问题。开发者需要采用自己的显式的锁。

.NET 3.5 没有添加任何技术,但是它确实使得我们更易于实现在函数式编程方面增强的程序。首先,它取消了定义自定义委托的思想。从那开始,在任何设计得足够好的 API 上,都可以重用泛型的 Action 和 Func 的委托。另一个优势是将 lambda 表达式引入到 VB 中,并且显著提升了它在 C#中的表现。结果是,使用这个 API,开发者可以很容易地像这样来创建他们自己的同步封装器:

复制代码
public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)

在之前的版本中,开发者需要对锁进行操作,与此不同的是,在新的 ConcurrentDictionary 类中的这个方法看起来很容易就可以正确使用。我们只需要简单地提供一个键值和一个委托,如果键值不存在就会执行委托。由于函数本身是线程安全的,因此一切都应该是原子级的。

好吧,就算不是。为了“避免在锁之下执行未知的代码而引发的各种问题”,valueFactory 委托没有在锁中执行。因此就可能存在竞争条件,开发者需要确保 valueFactory 委托只执行可重复的操作。

如果你需要这项功能,那么你需要将 ConcurrentDictionary 类和 Lazy 类组合。这样做的示例代码包含在 AsyncCache 类中,它也作为示例被发布了。

尽管这个功能随时都会改变,但当前 ConcurrentDictionary 的实现已经带有不用锁的读取了。为了提升性能,开发者可以提供写线程的估计数目。这会控制着哈希表将使用多少细粒度的锁。

你可以从 Stephen Toub 的博客中学到更多关于ConcurrentDictionary 的知识

查看英文原文: ConcurrentDictionary, .NET 4.0’s New Thread-Safe Hashtable

2010-01-31 18:078452
用户头像

发布了 340 篇内容, 共 126.3 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

虎虎生威新春大吉,2月更文挑战来袭!

InfoQ写作社区官方

2月月更 热门活动

如何系统分析项目的干系人?

石云升

项目管理 1月月更

快递,菜鸟驿站,直播购物:老年人的电商之墙

脑极体

模块六作业

黄秀明

「架构实战营」

再见,Microsoft Academic——你好,开放式研究基础设施?

DisonTangor

搜索引擎

openLooKeng基于选择率的动态过滤优化

openLooKeng

大数据

双龙贺岁,龙蜥 LoongArch GA 版正式发布

OpenAnolis小助手

Linux 开源 新年

(1-24/24)awesome「结构」

mtfelix

300天创作 2022Y300P

Hoo虎符研究院 | 币圈后浪 BreederDAO区块链游戏的NFT工厂

区块链前沿News

虎符 Hoo 虎符交易所

建一座国际连锁「商场」:openEuler 的雄心与蓝图 | 开源访谈《源创者说》首播

科技热闻

在线时间戳计算时间差

入门小站

工具

Go 语言快速入门指南:Go 实现简易Web应用

宇宙之一粟

Go web服务器 Go 语言 1月月更

架构训练营 week8 作业

红莲疾风

「架构实战营」

openLooKeng算子接口和执行流程

openLooKeng

【笔记】学《郭东白的架构课》:访谈|对话于冰(上)

术子米德

架构师成长笔记

并发不是并行

en

电商系统微服务化

皓月

「架构实战营」

拆分电商系统为微服务

tony

基于OpenMLDB v0.4.0快速搭建全流程线上AI应用

第四范式开发者社区

人工智能 机器学习 OpenMLDB 特征平台

建木持续集成平台v2.2.1发布

Jianmu

DevOps 持续集成 CI/CD

LabVIEW播放提示声音或者音乐

不脱发的程序猿

LabVIEW 播放提示声音或者音乐

openLooKeng | Oracle update和delete支持简介及实现

openLooKeng

Spark合并Iceberg小文件内存溢出问题定位和解决方案

漫长的白日梦

spark iceberg 小文件

openLooKeng助力中移在线获“ICT优秀案例”

openLooKeng

第六节:SpingBoot基本配置一

入门小站

springboot java

Microchip宣布标准非混合型宇航级电源转换器系列 已新增28伏输入耐辐射选项

Geek_2d6073

Microchip发布具有强大编程和调试功能的新型在线仿真器(ICE)

Geek_2d6073

【笔记】学《郭东白的架构课》:访谈|对话于冰(中)

术子米德

架构师成长笔记

【笔记】学《郭东白的架构课》:访谈|对话于冰(下)

术子米德

架构师成长笔记

ReactNative进阶(四十):应用 ListView 实现分组列表

No Silver Bullet

ListView React Native 1月月更

虎年就要玩虎符 春节就要瓜分虎符虎年大礼包

区块链前沿News

Hoo虎符 Hoo 虎年 春节活动

ConcurrentDictionary:.NET 4.0中新的线程安全的哈希表_.NET_Jonathan Allen_InfoQ精选文章