并发字典多次写入

时间:2013-09-30 01:30:23

标签: c# dictionary concurrency

我想知道,C#ConcurrentDictionary是否支持多个同时写入?或者所有写入序列化?我知道它针对阅读进行了优化,但写作呢?我可以期待多个线程不断写入字典的良好性能吗?

1 个答案:

答案 0 :(得分:4)

与普通字典一样,写入被“分组”到组中,然后这些存储区在锁定组中组合在一起。锁定组的数量称为字典的“并发级别”。默认情况下,并发级别等于Environment.ProcessorCount结果的4倍,但您可以使用several of its constructors覆盖它。

要确定这两个写入是否会达到同一个锁,它会使用私有方法GetBucketAndLockNo来确定要使用哪个哈希桶和哪个锁。

//Code generated via ILSpy from .NET 4.0
private void GetBucketAndLockNo(int hashcode, out int bucketNo, out int lockNo, int bucketCount, int lockCount)
{
    bucketNo = (hashcode & 0x7FFFFFFF) % bucketCount;
    lockNo = bucketNo % lockCount;
}

所以回答你的原始问题“我可以期待多个线程不断写入字典的良好表现吗?”答案实际上取决于散列的分布情况,以及是否会不断插入将落入同一锁定分组的记录。没有用现实世界数据测试它并且看它是否足够高效,就无法找到它。

另请注意,.NET 4.5中的there where performance improvements made to ConcurrentDictionary因此,如果您使用的是.NET 4.0 vs 4.5,则可能会更改结果。例如,如果您没有在构造函数中指定要使用的锁数,则会在字典增长时动态添加更多锁。