2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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:078793
用户头像

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

关注

评论

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

日增320TB数据,从ClickHouse迁移至ByConity后,查询性能十分稳定!

字节跳动开源

大数据 开源 云原生 Clickhouse 数仓

DataArts Studio实践丨通过Rest Client 接口读取RESTful接口数据的能力

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

Spring高手之路7——事件机制与监听器的全面探索

砖业洋__

spring 观察者模式 事件机制 Spring生命周期 Spring 监听

Spring高手之路9——掌握Spring条件装配的秘密武器

砖业洋__

spring Spring配置 @Profile @Conditional 条件装配

全面解析JMeter环境变量配置步骤

Liam

程序员 软件测试 测试 Jmeter 测试工具

软件测试 | 在Windows平台安装MySQL

测吧(北京)科技有限公司

测试

语音数据标注平台让语音识别技术更精准

数据堂

从零开始学极狐GitLab|01 环境搭建

极狐GitLab

Linux DevOps gitlab DevSecOps 环境搭建

.net core基于HttpClient实现的网络请求库

互联网工科生

.net core http client

软件测试 | Java程序的注释

测吧(北京)科技有限公司

测试

MES/MOM国内市场现状趋势与新生态模式参考

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

语音标注平台是推动人工智能发展的关键工具之一

数据堂

使用可视化低代码工具提高开发效率

互联网工科生

低代码 可视化开发 JNPF

关于互联网产业的一些思考

用友BIP

产业互联网

Spring高手之路8——Spring Bean模块装配的艺术:@Import详解

砖业洋__

@Import 模块装配 Import注解 ImportSelector Spring动态装配

与用户“同频”,海尔空调带来行业第三次科技革命

脑极体

绿色 空调

软件测试 | 在Linux平台下安装MySQL

测吧(北京)科技有限公司

测试

装备制造行业数智人力应从何入手?超实用干货来了!

用友BIP

人力资源

Nautilus Chain 主网上线,创世 ZBC 质押即将开启

西柚子

实时社群技术专题(三):百万级成员实时社群技术实现(关系系统篇)

JackJiang

网络编程 即时通讯 IM

低代码技术分享官丨浅谈DevOps实践过程

inBuilder低代码平台

DevOps

MQTT 与 Kafka|物联网消息与流数据集成实践

EMQ映云科技

kafka 物联网 mqtt 流数据

标准化,企业财务共享中心的灵魂内核(下)——领先实践分享

用友BIP

财务共享

云智慧「智能运维6.0产品发布会」与您相约7.24运维日

云智慧AIOps社区

智能运维 #运维 智能运维AIOps 运维智能化

软件测试 | Java中的关键字

测吧(北京)科技有限公司

测试

LigaAI:从效率、度量和价值维度,成为研发团队的智能医生

LigaAI

研发管理 SaaS 研发协作平台 TO B 企业号 7 月 PK 榜

软件测试 | 数据类型的转换

测吧(北京)科技有限公司

测试

Windows10 下 Neo4j1.5.8 安装教程

北桥苏

Python neo4j 图数据库 py2neo 知识问答系统

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