写点什么

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

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

关注

评论

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

如何提升存储性能之IO模型和AIO大揭秘

焱融科技

数据 io 存储 焱融科技 分布式文件存储

iOS底层系统小结

shirley

ios

上海与鲲鹏的数字共鸣

脑极体

杂谈

落曦

架构师训练营第四周学习笔记

李日盛

笔记

一周信创舆情观察(11.2~11.8)

统小信uos

《迅雷链精品课》第四课:区块链技术发展趋势

迅雷链

区块链

架构师训练营第四周作业

李日盛

架构

线上排障技巧 | 动态修改LOGGER级别

AI乔治

Java 编程 架构 JVM

大招落地:MySQL 插入更新死锁源码分析

AI乔治

Java MySQL 编程 架构

架构师训练营第 1 期 - 第 8 周课后练习

Anyou Liu

极客大学架构师训练营

太牛了,腾讯T4Java技术专家手撸的Redis技术笔记,一周内下载量已突破30W。

Java架构之路

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

【涂鸦物联网足迹】涂鸦云平台接口列表—智能门锁

IoT云工坊

人工智能 云计算 物联网 API 智能门锁

Maven 入门

少平

Java

16张图带你彻底搞懂基数排序

Java架构师迁哥

【薪火计划】01 - 好与坏

AR7

管理

fastJson与一起堆内存溢出'血案'

AI乔治

Java 架构 JVM Fastjson 内存溢出

架构师训练营 1 期 -- 第八周笔记

曾彪彪

极客大学架构师训练营

“先加密后签名”是不是安全?看完这篇就秒懂!

华为云开发者联盟

安全 加密 签名

Maven 进阶

少平

Scala-语法特性(一):类型和变量定义

正向成长

scala

用eBPF/bcc分析系统性能的一个简单案例

AI乔治

Java 编程 架构 大前端

linux下定位多线程内存越界问题实践总结

小Q

Java Linux 学习 面试 多线程

区块链技术发展需加强核心技术自主创新

CECBC

区块链技术

数字货币是数字经济发展基石

CECBC

数字货币

“双11”正成为区块链场景应用“练兵场”

CECBC

大数据

【得物技术】机器学习在图形验证码识别上的应用

得物技术

学习 算法 测试 图像识别 验证码

java是如何调用native方法?hotspot源码分析必会技能

诸葛小猿

Java jdk JVM jni hotspot

从 Android 到 Java:如何从不同视角解决问题?

Java架构师迁哥

如果说数据是推动自动驾驶的原动力,那么存储扮演什么角色?

焱融科技

自动驾驶 数据 存储 文件存储 自动驾驶训练

这篇 MySQL 索引和 B+Tree 讲的太通俗易懂!

MySQL 面试 数据库事务 索引结构

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