写点什么

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

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

关注

评论

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

编程新手如何提高编程能力?

代码生成器研究

阿里云崩了:企业未来该怎么选择云厂商?

轶天下事

SQL 中的 MIN 和 MAX 以及常见函数详解及示例演示

小万哥

MySQL 数据库 sql 程序员 后端开发

PDF转Word,1行Python代码就够了,免费用

程序员晚枫

Python PDF word 自动化办公

2023 CCHIO | 共襄盛会,为肿瘤防治创新发展贡献觅健力量

联营汇聚

开源之夏 2023 | Databend 社区项目总结与分享

Databend

AppLink结合金蝶云星空作订单信息同步流程

RestCloud

零代码 APPlink

低代码究竟能干什么?

代码生成器研究

2024年企业软件定制开发必须了解的4大趋势

飞算JavaAI开发助手

数字化转型 企业 定制软件开发 技术服务

透过一台电视,看到万家星闪

脑极体

通信

让公有云服务“宁安如梦”的“定心丸”在哪里?

轶天下事

2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。 它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足

福大大架构师每日一题

福大大架构师每日一题

还在为考试重题、错题而头疼?大可不必!时习知新功能了解一下!

轶天下事

如何打破资产盘点壁垒,用友BIP资产云来支招!

用友BIP

资产盘点

当前各类厂商纷纷入局低代码赛道,关于低代码未来的发展前景如何?

代码生成器研究

前言 | AI工程化部署

AIWeker

AI AI工程化部署

华为数字治理经验,首次披露!

轶天下事

企业如何选择一款高效的ETL工具

RestCloud

ETL

编程到底难在哪里?

代码生成器研究

程序员指南|学会与大模型相处,提升个人开发效率

飞算JavaAI开发助手

程序员 软件开发 人工智能「 ChatGPT

2023中关村论坛系列活动——英特尔智能医疗健康创新合作论坛在京成功举办

E科讯

以太坊铭文聚合交易平台 Scorpio,铭文爆发的新推手?

股市老人

乌卡时代确定性稀缺,企业多云战略最需看中什么?

轶天下事

国际版Amazon Lightsail的功能解析

穿过生命散发芬芳

AWS Lightsail 轻量级服务器

做好数据治理,推动国有企业数据资产化加速落地!

用友BIP

数据治理 数据资产入表

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