写点什么

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

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

关注

评论

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

我在编码过程使用Jenkins自动化的姿势

大东(AIP智能体运营专员)

自动化测试技术笔记(三):如何编写技术方案

老张

自动化测试 技术方案

华为云会议,助力企业高效办公

秃头也爱科技

超高清设计师云工作站,为设计企业护航

清欢科技

云上办公,还得是华为云桌面的一站式云上工作站

科技之光

对比PyTorch、TensorFlow、JAX、Theano,我发现都在关注两大问题

OneFlow

人工智能 深度学习 函数转换

2022-12-21:uifd/ui-for-docker是docker的web可视化工具。请问部署在k3s中,yaml文件如何写?

福大大架构师每日一题

Docker 云原生 k8s k3s 福大大

头部效应明显,中小厂商「闷赚」的 Dating 赛道

融云 RongCloud

社交 虚拟

华为云会议——安全得多,高效得很

秃头也爱科技

What's new in dubbo-go v3.0.4

apache/dubbo-go

dubbo Dubbo服务 Dubbo网关

华为云会议助力政企用户提升沟通效率

科技说

超高清设计师云工作站,设计可以更高效

清欢科技

HTTP的状态码

穿过生命散发芬芳

HTTP 12月月更

mysql数据库运维常用的shell脚本

@下一站

12月日更 12月月更

华为云会议,总有一种场景满足你的需求

科技说

安全灵活,华为云桌面成为数字化办公最佳搭档

清欢科技

低成本、高效率!华为云桌面助力企业数字化转型

清欢科技

华为云桌面,开启云上高效办公之旅!

清欢科技

数字云办公连续7年领跑,华为云桌面优势突显!

科技之光

数字化办公?选云桌面就对了!

科技之光

云办公成趋势,华为云桌面全方位保障企业安全

科技之光

华为云桌面之下的“冰山”:技术底座x繁荣生态加速模式进化

IT科技苏辞

简单易用的监控告警系统 | HertzBeat 在 Rainbond 上的使用分享

北京好雨科技有限公司

webAssembly on server side 的应用场景

磊吐槽

云原生 webassembly

华为云会议好评如潮的背后,竟然暗藏这么多黑科技!

科技说

Verilog模块例化

芯动大师

Verilog语法 Verilog例化模块 Verilog教程

【JWT】jwt令牌研究

No8g攻城狮

JWT\ JWT

开源创新 源起潮“蜥”——龙蜥社区走进浪潮信息 MeetUp 即将开幕

OpenAnolis小助手

云原生 Meetup 龙蜥社区 浪潮信息 开源活动

「实操」适配 NebulaGraph 新版本与压测实践

NebulaGraph

图数据库

华为云桌面,一站式云上数字化创作深度解读

IT科技苏辞

云上办公,且看华为云桌面如何加速企业数字化发展之路?

科技之光

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