10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

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

关注

评论

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

ReactNative进阶(二十八):ES6 Symbol 用法

No Silver Bullet

React Native symbol 1月月更

Linux之cal命令

入门小站

大白话讲解JDK源码系列:从头到尾再讲一遍ThreadLocal

慕枫技术笔记

后端 1月月更

(1-19/19)市场和销售分别该怎么干

mtfelix

300天创作 2022Y300P

用Java实现线段树

CRMEB

使用 React 和 Next.js 构建博客

devpoint

React nextjs 1月月更

Go len() 函数是如何计算长度的?

宇宙之一粟

Go Go 语言 1月月更

ReactNative进阶(三十):Component、PureComponent 解析

No Silver Bullet

​React Native 1月月更 Component

关于jiami货币--《香帅中国财富报告》摘录(6/100)

hackstoic

投资

冬奥探秘:那些隐匿在冬奥中的“绿科技”

脑极体

(1-18/18)推播式营销vs.集客式营销

mtfelix

300天创作 2022Y300P

低代码实现探索(二十九)混合式低代码

零道云-混合式低代码平台

ShardingSphere JDBC 分库实现多数据库源

Java 数据库 分库分表 Apache ShardingSphere

22 Prometheus之Docker监控简述

穿过生命散发芬芳

Prometheus 1月月更

测试工程师的职场发展二三谈

老张

自动化测试 解决方案 职场发展

C/C++开发方向如何选择?坚持C++还有意义吗?

赖猫

c++ Linux 服务器

【网络安全】详细记录一道简单面试题的思路和方法

H

网络安全

明道云帮助外贸行业实现数字化管理

明道云

vue 作者在2022-2-7起宣布 vue3 正式作为默认版本

你?

kali权限提升之本地提权

喀拉峻

网络安全 信息安全 提权

第七周作业

lv

音视频开发学习:HLS 协议详解

赖猫

c++ 音视频 ffmpeg HLS 音视频开发

PDF 文件如何转成 markdown 格式

汪子熙

markdown PDF pdf.js 1月日更 1月月更

JavaScript 基本数据类型转换

编程三昧

JavaScript 前端 1月月更

在线XML转CSV工具

入门小站

工具

《腾讯云原生在线技术工坊》实践体会

穿过生命散发芬芳

腾讯云 云原生 1月月更 实践体会

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」系统服务底层原理以及高性能存储设计分析

码界西柚

RocketMQ 阿里巴巴‘ Alibaba技术 Apache RocketMQ 1月日更

电商秒杀系统架构设计

AHUI

「架构实战营」

微信业务架构分析 & 学生管理系统架构选型

AragornYang

架构训练营 架构实战营

微信业务架构图 & 学生管理系统架构设计

阿卷

架构实战营

构建多架构镜像的最佳实践

xcbeyond

Docker arm docker image xcbeyond 1月月更

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