.net源码分析 - ConcurrentDictionary<TKey, TValue>

分析: http://www.cnblogs.com/brookshi/p/5583892.html

 

继上篇Dictionary源码分析,上篇讲过的在这里不会再重复

ConcurrentDictionary源码地址:https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/ConcurrentDictionary.cs

ConcurrentDictionary一大特点是线程安全,在没有ConcurrentDictionary之前在多线程下用 Dictionary,不管读写都要加个锁,不但麻烦,性能上也不是很好,因为在上篇分析中我们知道Dictionary内部是由多个bucket组成, 不同bucket的操作即使在多线程下也可以不互相影响,如果一个锁把整个Dictionary都锁住实在有点浪费。

不过凡事都有两面性,给每个Bucket都加一个锁也不可取,Bucket的数量和Dictionary元素数量是一样的,而Bucket可能会有 一部分是空的,而且访问Dictionary的线程如果数量不是太多也根本用上不这么多锁,想想即使有10个线程在不停的操作这个Dictionary, 同时操作的最多也就10个,即使两两冲突访问同一个Bucket,5个锁就够了,当然这是最好的情况,最坏情况是这5个bucket用同一个锁。所以,要 得到最好的结果需要尝试取一个最优解,而影响因素则是bucket数量和线程数量。我们想要的结果是锁够用但又不浪费。

微软得出的结果是默认的锁的数量是CPU核的个数,这个线程池默认的线程数量一样。随着Dictionary的扩容,锁的个数也可以跟着增加,这个可以在构造函数中自己指定。

下面看看ConcurrentDictionary里元素是做了怎样的封装。

posted on 2016-06-17 16:01  邬兴亮  阅读(207)  评论(0编辑  收藏  举报

导航