2

例如我可以去:

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

其中项目是:

Dictionary<string, MyObject>

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

更新:我意识到我上面的例子不是线程安全的,因为字典的大小可以在行之间改变。但是呢:

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

2 回答 2

3

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

来自 MSDN:

只要不修改集合,字典就可以同时支持多个阅读器。即便如此,通过集合枚举本质上不是线程安全的过程。在枚举与写访问竞争的极少数情况下,必须在整个枚举期间锁定集合。要允许集合被多个线程访问以进行读写,您必须实现自己的同步。

于 2012-06-16T10:59:03.380 回答
1

如果字典在另一个线程上被变异,那么这样做是不安全的。首先想到的是字典可能会调整其内部缓冲区的大小,这肯定不能很好地与并发迭代配合使用。

如果您不更改键并且只写入值,那么这在实践中应该是安全的。

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

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

于 2012-06-16T10:59:07.123 回答