正在访问Dictionary <tkey,tvalue =“”> Keys属性线程安全吗?</tkey,>

时间:2012-06-16 10:55:52

标签: c# thread-safety

例如我可以去:

string[] keys = new string[items.Count];
items.Keys.CopyTo(keys);

物品是:

Dictionary<string, MyObject>

可能被另一个线程修改的实例? (我不清楚,如果在访问Keys属性时,Dictionary的内部工作会迭代集合 - 在这种情况下我知道它不是线程安全的。)

更新:我意识到上面的例子不是线程安全的,因为Dictonary的大小可能会在行之间发生变化。然而呢:

Dictionary<string, MyObject> keys = items.Keys;
string[] copyOfKeys = new string[keys.Count];
keys.Keys.CopyTo(copyOfKeys );

2 个答案:

答案 0 :(得分:3)

不,Dictionary不是线程安全的。如果您需要线程安全并且使用的是.NET 4或更高版本,则应使用ConcurrentDictionary

来自MSDN:

  

字典可以同时支持多个读者,   只要集合没有被修改。即便如此,列举   通过集合本质上不是一个线程安全的过程。在   枚举与写访问争用的罕见情况   必须在整个枚举期间锁定集合。允许的   多个线程可以访问的集合,用于读写   你必须实现自己的同步。

答案 1 :(得分:1)

如果字典在另一个线程上发生变异,则执行此操作是不安全的。首先想到的是,字典可能会调整其内部缓冲区的大小,这对于并发迭代肯定不会很好。

如果您没有更改密钥而只是编写值,这在实践中应该是安全的。

无论如何,我不会将这些代码投入生产,因为风险太高。如果某个.NET补丁改变了Dictionary的内部并且突然出现了错误,该怎么办?还有其他问题。

我建议您使用ConcurrentDictionary或其他一些安全策略。为什么要赌你的代码正确?