NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

2022不容错过的50个“低代码”发展现状、趋势与数据统计

优秀

低代码 无代码

SpringMVC(六、声明式事务控制)

开源 springmvc 8月月更

【等保小知识】过等保一定要买堡垒机吗?堡垒机有什么作用?

行云管家

网络安全 等保 堡垒机 等级保护 过等保

ITSM入门指南 | IT团队如何向客户提供端到端的IT服务?

龙智—DevSecOps解决方案

ITSM ITSM软件 ITSM解决方案

CI与开源代码安全篇 | 龙智邀您共赴GOPS全球运维大会,探索大规模、敏捷、安全、开放式的软件研发与运营之路

龙智—DevSecOps解决方案

GOPS大会 运维‘

一块GPU训练TB级推荐模型不是梦,OneEmbedding性能一骑绝尘

OneFlow

深度学习 gpu 模型

龙智集团赢得2022年Atlassian与AWS云销售竞赛

龙智—DevSecOps解决方案

云原生

机器学习/评分卡常用指标及计算

Joshua

机器学习 AI 信息熵 评分卡

兆骑科创双创服务平台,招商引资、招企引税、招才引智

兆骑科创凤阁

【分布式集群】微服务电商应用系统的集群构建

嚯嚯嚯www

Linux

前端监控系列1| 字节的前端监控SDK是怎样设计的

字节跳动终端技术

前端 监控 sdk

开源一夏|eTS UI的Text组件怎么设置文本垂直排列

坚果

开源 OpenHarmony 8月月更

京东承办“创客北京2022” 京东科技参与并推出三大服务举措

京东科技开发者

数字化转型 供应链 企业服务 中小企业

CI/CD | 使用静态代码分析工具,有效补充持续集成

龙智—DevSecOps解决方案

cicd 持续集成 CI/CD

Java面向对象之继承

楠羽

什么是网络即服务 (NaaS)?

wljslmz

网络技术 8月月更 NaaS 网络即服务

MySQL 原理与优化:原数据锁的应用

老崔说架构

兆骑科创创新人才引进,高端人才引进,项目落地引进

兆骑科创凤阁

一文读懂工业设备预测性维护的概念与实现

PreMaint

企业设备管理 预测性维护 设备健康管理 状态检测 振动监测

开源一夏 | Spring MVC深度学习

叶秋学长

开源 Spring MVC 8月月更

一文了解如何托管SVN储存库,以及版本控制的更佳选择

龙智—DevSecOps解决方案

svn 版本控制 版本管理 版本控制系统

融云 | 云办公时代,企业通讯录的技术选型

融云 RongCloud

企业 云办公

【8.5-8.12】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

Canvas 低代码拖拽建模,支持离线任务|ModelWhale 版本更新

ModelWhale

数据分析 Jupyter Notebook 课程 离线部署 低代码报告

你要的 Helm Chart 应用金丝雀发布终于来了!

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

5K字详解Java 注解及其底层原理

了不起的程序猿

Java 编程语言 后端 java程序员 java编程

快速实现 CDN 直播

ZEGO即构

CDN 直播 音视频开发

如何开启企业数字化转型?

博文视点Broadview

如何在 Anolis 8上部署 Nydus 镜像加速方案?

OpenAnolis小助手

Linux 开源 内核 龙蜥操作系统 容器镜像加速

RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器)

矜辰所致

RT-Thread 8月月更

【LeetCode】用户分组Java题解

Albert

LeetCode 8月月更

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