写点什么

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

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

关注

评论

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

Verilog 时序控制

芯动大师

Verilog Verilog语法 Verilog时序控制

80%的前端开发都答不上来的js异步面试题

loveX001

JavaScript

高级前端一面常考react面试题总结

beifeng1996

React

一天梳理完React所有面试考察知识点

beifeng1996

React

ERP系统是什么?能起到什么作用?

优秀

ERP系统

Best Machine Learning Tools for Java

Mahipal_Nehra

Java AI Machine Learning tools best tools

Docker进阶:step by step

无人之路

Docker

FLStudio2023中文版远程安装下载

茶色酒

flstudio FLStudio21 FLStudio21.0.0

JAVA中生成随机数Random VS ThreadLocalRandom性能比较

JAVA旭阳

Java

JS模块化—CJS&AMD&CMD&ES6-前端面试知识点查漏补缺

loveX001

JavaScript

可视化:数据可视化的作用

Data 探险实验室

数据分析 可视化 数据可视化 数据大屏

聚焦技术,锐意创新,GaussDB给世界一个更优选择

极客天地

易观分析:手机银行季度活跃用户突破7亿人,个人养老金业务争夺战开启

易观分析

手机银行 个人养老金

知道这个网站你就不用买实体书了

邱比特讲编程

程序员 资源 电子书 大学生

Python:界面开发,wx入门篇

eng八戒

Python PyQt GUI WxPython tkinter

一年半经验如何准备前端面试

loveX001

JavaScript

迎接工业互联网的龙卷风暴,软通动力绘制了一张转型地图

脑极体

开放云主机端口

好吃不贵

那些你不知道的炫酷开关交互效果(12种)

南城FE

CSS 前端 交互设计

中小企业运营自媒体为何多以失败告终

石头IT视角

创新研发负载分担机制,天翼云IPv6网络带宽再升级!

天翼云开发者社区

负载均衡 网络 ipv6

spring boot+mybatis整合

@下一站

MySQL mybatis 12月日更 12月月更 springboot框架

瓴羊Quick BI 权限管理:开拓数据分析效率和智能化水平的新高度

对不起该用户已成仙‖

Spark架构

穿过生命散发芬芳

spark 12月月更

Docker上手:step by step

无人之路

Docker

Ubuntu无法切换到桌面tty7解决

Geek_pwdeic

ubuntu

纷繁复杂见真章 华为云大型产品需求管理利器CodeArts Req解读

极客天地

一个将日志消息仅区分为 info 和 error 的实践分享

Tiger Wang

开源 最佳实践 日志

一道React面试题把我整懵了

beifeng1996

React

数字先锋 | 主机、硬盘、CPU统统没有? 这个电教室有点“潮”!

天翼云开发者社区

云主机 云电脑

安全可信 | 强墙出击!天翼云Web应用防火墙(原生版)硬核亮相!

天翼云开发者社区

安全 防火墙

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