写点什么

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

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

关注

评论

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

3DCAT亮相2024中国国际消费电子博览会,引领AI潮流

3DCAT实时渲染

AIGC解决方案 XR实时云渲染

《使用Gin框架构建分布式应用》阅读笔记:p212-p233

codists

golang gin 编程人 codists

如何选择合适的工程项目管理系统?9款详解

爱吃小舅的鱼

工程项目管理系统

CDN节点的作用及加速原理解析

HUODUNYUN

CDN CDN加速 CDN技术 CDN带宽

大势所趋,数字化转型是企业活下去的必选项

禅道项目管理

团队管理 数字化转型 企业管理 项目管理软件 数字化转型咨询

Microsoft Office LTSC 2024 Mac版安装包 附破解工具

Rose

HarmonyOS NEXT开发实战:实现高效下拉刷新与上拉加载组件(二)刷新核心逻辑与空页面集成

王二蛋和他的张大花

鸿蒙

初学者指南:API 设计的核心步骤与方法

爱吃小舅的鱼

API 设计

Apache Calcite System Catalog 实现探究

端小强

Calcite

taobao.item_get_desc API返回值中的促销信息与活动标签探究

代码忍者

API 接口 pinduoduo API

如何让Nginx更安全?

江南一点雨

RTE2024:聚焦Gen AI 时代的 RTE,声网发布 RTE+AI 能力全景图

ToB行业头条

数字身份发展趋势前瞻:零信任

芯盾时代

数字身份 iam 零信任 统一身份管理平台

NPM 包开发与优化全面指南

Immerse

npm package.json

融云IM信息托管服务,用户资料、好友关系、群组信息全覆盖

融云 RongCloud

HarmonyOS NEXT开发实战:打造高效上拉刷新与下拉加载组件(一)空页面的设计与实现

王二蛋和他的张大花

鸿蒙

机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)

汀丶人工智能

人工智能

苹果电脑可以玩英雄联盟吗?macbook能玩lol?

阿拉灯神丁

游戏 #Mac 苹果电脑 CrossOver Mac下载 CrossOver 24

实时渲染什么意思?实时渲染与一般渲染的区别

3DCAT实时渲染

云渲染 实时渲染 实时云渲染 3D实时渲染

酒店管理系统(源码+文档+部署+讲解)

深圳亥时科技

降本60% ,阿里云 EMR StarRocks 全新发布存算分离版本

阿里云大数据AI技术

大数据 Serverless StarRocks 弹性伸缩 EMR

物资管理系统(源码+文档+部署+讲解)

深圳亥时科技

Parallels Desktop 19 for Mac(PD19虚拟机)一键激活版

Rose

LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总

汀丶人工智能

AI Market全球首创“反向期权”——引领智能金融新时代,重塑全球交易格局!

科技热闻

文档管理系统

深圳亥时科技

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