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的实现已经带有不用锁的读取了。为了提升性能,开发者可以提供写线程的估计数目。这会控制着哈希表将使用多少细粒度的锁。
分享到:
相关推荐
Python中的MongoDB事务简介多文档交易已于2018年6月到达一直围绕单个文档的更新进行交易。 现在,通过多文档事务,我们可以将一组数据库操作包装在start和commit事务调用中。 这样可以确保即使在多个集合和/或数据库...
.NET Core的LocalizationProvider .NET Core应用程序的数据库驱动的本地化提供程序。支持的本地化提供商如果您觉得这个图书馆有用,那么喝杯咖啡会很棒! 您可以通过支持库的进一步开发。什么是LocalizationProvider...
"CiteSpaceⅡ:科学文献中新趋势与新动态的识别与可视化.pdf"很可能是该软件的详细介绍,专注于其在识别和可视化新趋势上的应用。这可能包括了如何使用CiteSpace的高级功能,如预测性分析,来预判未来的研究趋势。...
支持的本地化提供商 如果您觉得这个图书馆有用,那么喝杯咖啡会很棒! 您可以通过支持库的进一步... 请以了解有关v6中新功能的更多信息。 源代码回购 整个库包分为多个git repos(之间有子模块链接)。 以下是所有相关
同时也介绍了.net 3.0和.net 3.5中新的编程api,包括wpf 、wcf和wf 的功能;另外,还介绍了最新的c# 3.0编程语言、linq编程技术、com与.net 的互操作性以及平台无关的.net开发。 本书由微软c# mvp andrew troelsen...
安古里数学.NET中新的领先的符号代数库。 一个人需要的一切。 ( , ) ···什么事啊 AngouriMath是一个开源的符号代数库。 也就是说,通过AngouriMath,您可以自动求解方程式,方程组,处理集合,区分,从字符串...
20210315-平安证券-十四五时期中国经济解析:新格局中新动力.pdf
同时也介绍了.NET 3.0 和.NET 4 中新的编程API,包括WPF 、WCF 和WF 的功能;另外,还介绍了最新的C# 4.0 编程语言、LINQ 编程技术、COM 与.NET 的互操作性以及平台无关的.NET 开发。 本书由微软C# MVP Andrew ...
《C# 4.0:完全参考》是一本全面介绍C# 4.0编程语言的书籍,作者是计算机领域的著名专家Herbert Schildt。这本书不仅涵盖了C# 4.0的所有基本概念和技术细节,还提供了丰富的实例来帮助读者更好地理解和掌握这门语言...
这一版还介绍了C# 4.0 中新加入的动态类型,它简化了与包括COM Automation 对象在内的动态.NET语言的集成。联合使用动态类型和ExpandoObject 这样的DLR 类型,你可以在C# 里创建并实现真正的动态类型,本书所探讨的...
### 白皮书:Delphi2009中新的DataSnap #### 引言 长久以来,Delphi作为一款强大的开发工具,一直包含了用于构建多层数据库应用的技术。早期这项技术被称为MIDAS,后来发展为DataSnap。DataSnap原本是基于COM...
同时也介绍了.NET 3.0和.NET 3.5中新的编程API,包括WPF 、WCF和WF 的功能;另外,还介绍了最新的C# 3.0编程语言、LINQ编程技术、COM与.NET 的互操作性以及平台无关的.NET开发。 注:本书为英文版PDF
1. 一体两翼战略:报告首次提出了中新集团的战略规划,即以园区开发运营为主体,以产业载体配套和绿色公用为支撑,形成“一体两翼”的协同发展模式。在这里,“一体”指园区的开发和运营,“两翼”是指产业载体配套...
主要介绍ASP.NET 5简介以及对各个版本号进行解释,ASP.NET 5中新的变化,需要的朋友可以参考下。
7-3 《C#与.NET 3.5高级程序设计》...同时也介绍了.NET 3.0和.NET 3.5中新的编程API,包括WPF 、WCF和WF 的功能;另外,还介绍了最新的C# 3.0编程语言、LINQ编程技术、COM与.NET 的互操作性以及平台无关的.NET开发。
《C#与.NET3.5高级程序设计(第4版)》是C#...同时也介绍了.NET3.0和.NET3.5中新的编程API,包括WPF、WCF和WF的功能;另外,还介绍了最新的C#3.0编程语言、LINQ编程技术、COM与.NET的互操作性以及平台无关的.NET开发。
Asp.Net 的本地化提供程序 .Net Core 应用程序的数据库驱动本地化提供程序。 支持本地化提供商 如果你觉得这个库很有用,喝杯咖啡会很棒! 您可以通过支持库的进一步开发。 什么是 LocalizationProvider 项目? ...
7-4 《C#与.NET 3.5高级程序设计》...同时也介绍了.NET 3.0和.NET 3.5中新的编程API,包括WPF 、WCF和WF 的功能;另外,还介绍了最新的C# 3.0编程语言、LINQ编程技术、COM与.NET 的互操作性以及平台无关的.NET开发。
这一版还介绍了c# 4.0 中新加入的动态类型,它简化了与包括com automation 对象在内的动态.net语言的集成。联合使用动态类型和expandoobject 这样的dlr 类型,你可以在c# 里创建并实现真正的动态类型,本书所探讨的...