写点什么

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

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

关注

评论

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

聚焦机器同传前沿进展,第二届机器同传研讨会将在NAACL举办

百度大脑

人工智能 机器

从底层原理出发,了解Linux内核之内存管理

Linux服务器开发

后端 操作系统 内存管理 Linux内核 底层原理

带你遨游银河系的十种分布式数据库

悟空聊架构

数据库 分布式 分布式数据库 6月日更

入职美团定级P7,总结2021年最新180道高级岗面试题及答案

Java架构师迁哥

一文读懂开源项目 OpenHarmony2.0

科技热闻

博客

vincentjia

看Kunpeng BoostKit 使能套件如何实现大数据场景倍级性能提升

华为云开发者联盟

大数据 开源 鲲鹏 鲲鹏计算 Kunpeng BoostKit

阿里都会问些什么?4面阿里余额宝Java高级技术岗

Java架构师迁哥

双非本科逆袭记,阿里技术四面+交叉面+HR面,成功拿到offer

Java架构师迁哥

别乱打日志了,这才是正确的打日志姿势!

xcbeyond

日志 规范 6月日更

全过程智慧教育,看北京四中网校和亚马逊云科技如何实现?| 精选案例

亚马逊云科技 (Amazon Web Services)

iOS开发-Objective-C 中的 MVVM 模式介绍

iOSer

ios objective-c MVVM ios开发

不愧是清华大佬,一个联机对战游戏就把23种设计模式给抽丝剥茧了

Java架构师迁哥

大陆集团携手亚马逊云科技打造创新的汽车软件平台

亚马逊云科技 (Amazon Web Services)

限流篇,欣赏阿里开源Sentinel

下雨喽

架构 设计 sentinel 限流

2021版最新!字节跳动3面+腾讯6面一次过,谈谈我的大厂面经

Java架构之路

Java 程序员 架构 面试 编程语言

老同学突然升到了阿里P7,只因偷偷掌握了JVM的奥秘?

Java架构师迁哥

代码写的烂才是原罪?字节三面+微信四面+PayPal四面,大厂面经分享

Java 程序员 架构 面试

上云就上百度智能云,百度智能计算峰会召开,AI原生云全新升级

百度大脑

AI 智能云 峰会

探讨AI人才培养新思路,2021北京智源大会百度AI人才培养论坛召开

百度大脑

AI 人才培养

深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

Kaito

redis zookeeper 分布式 后端

京东T8Java架构师呕心沥血总结整理的《15w字的Java面试手册》免费开放分享给大家复习。

Java架构之路

Java 程序员 架构 面试 编程语言

普通二本,吃透这份阿里高级专家的《Java面试手册21版》成功拿下腾讯offer

Java架构师迁哥

干货:ANR日志分析全面解析

vivo互联网技术

android 堆栈 日志分析 anr

HTTPS协议

IT视界

解读革命性容器集群CCE Turbo:计算、网络、调度全方位加速

华为云开发者联盟

容器 华为云 CCE Turbo 集群服务器

如何在 Electron 上实现 IM SDK 聊天消息全文检索

网易云信

全文检索 Electron IM

本科毕业六年,备战一个月,四面阿里巴巴定级P7

Java架构师迁哥

从零开始学习3D可视化之坐标系

ThingJS数字孪生引擎

物联网 可视化 数字时代 3D模型 3D可视化

@成都的Coder

蚂蚁集团移动开发平台 mPaaS

flutter 移动开发 mPaaS

即时通讯系列-WorkPlus简介

WorkPlus

开源 即时通讯 IM 办公自动化

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