写点什么

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

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

关注

评论

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

Java开发技术很难吗?

小谷哥

Flink核心组件

穿过生命散发芬芳

flink 12月月更

易观分析潘玉宇:信贷全流程化监管将成行业发展重点,银行间联合风控程度将逐渐加深

易观分析

银行 普惠金融

北京同仁堂两大名牌品种亮相帝都

联营汇聚

KCL - 让 Kubernetes 资源清单管理更容易

Peefy

编程 Serverless Kubernetes #开源 #DevOps

react源码分析:实现react时间分片

flyzz177

React

架构实战营 2-6 钱包高可用实战随堂练习

西山薄凉

「架构实战营」

从React源码来学hooks是不是更香呢

flyzz177

React

react源码分析:babel如何解析jsx

flyzz177

React

Java培训一般需要多长时间?

小谷哥

RocketMQ 在网易云音乐的实践

Apache RocketMQ

RocketMQ 消息

React 之 Context 的变迁与背后实现

冴羽

JavaScript 源码分析 前端 前端框架 React

架构实战营 2-5 微信红包分析随堂测验

西山薄凉

「架构实战营」

重磅 | 九科信息入选创新型中小企业(原深圳市专精特新企业)

九科Ninetech

2022-12-12:有n个城市,城市从0到n-1进行编号。小美最初住在k号城市中 在接下来的m天里,小美每天会收到一个任务 她可以选择完成当天的任务或者放弃该任务 第i天的任务需要在ci号城市完成,

福大大架构师每日一题

算法 rust 福大大

2022年11月中国汽车智能网联月度观察

易观分析

汽车 智能网联

【前端相关】服务端渲染和客户端渲染的比较

No8g攻城狮

CSS css3 前端 js 前端框架

【IntelliJ IDEA】【SVN】SVN详细的介绍和Idea中如何使用SVN

No8g攻城狮

ide svn Git Submodule git fetch IDEA DeBug

带你实现react源码的核心功能

flyzz177

React

学习java开发技术应该如何入手

小谷哥

“智造新未来”欧比护理智造总部奠基仪式

联营汇聚

FLStudio21.0.0水果官方中文版发布功能介绍

茶色酒

FLStudio21.0.0

卡塔尔世界杯出现了半自动越位识别技术、动作轨迹捕捉等黑科技。

汀丶人工智能

12月日更 12月月更 世界杯黑科技

前端培训学习前景怎么样

小谷哥

Verilog 时延与过程结构

芯动大师

Verilog语法 Verilog延时 Verilog过程结构

JDK自带命令优化

@下一站

代码优化 12月日更 12月月更 jvm优化 java程序优化

react源码中的生命周期和事件系统

flyzz177

React

演讲实录|OpenMLDB 与阿里云 MaxCompute 生态集成

第四范式开发者社区

人工智能 数据库 开源 时序数据库 特征

数据生态第四弹 | OpenMLDB Hive Connector,架构起数据仓库到特征工程的生态桥梁

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

云计算的六大核心技术,你了解多少?

Finovy Cloud

云技术 云渲染

从React源码角度看useCallback,useMemo,useContext

flyzz177

React

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