例如我可以去:
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 );
答案 0 :(得分:3)
不,Dictionary
不是线程安全的。如果您需要线程安全并且使用的是.NET 4或更高版本,则应使用ConcurrentDictionary
。
来自MSDN:
字典可以同时支持多个读者, 只要集合没有被修改。即便如此,列举 通过集合本质上不是一个线程安全的过程。在 枚举与写访问争用的罕见情况 必须在整个枚举期间锁定集合。允许的 多个线程可以访问的集合,用于读写 你必须实现自己的同步。
答案 1 :(得分:1)
如果字典在另一个线程上发生变异,则执行此操作是不安全的。首先想到的是,字典可能会调整其内部缓冲区的大小,这对于并发迭代肯定不会很好。
如果您没有更改密钥而只是编写值,这在实践中应该是安全的。
无论如何,我不会将这些代码投入生产,因为风险太高。如果某个.NET补丁改变了Dictionary
的内部并且突然出现了错误,该怎么办?还有其他问题。
我建议您使用ConcurrentDictionary
或其他一些安全策略。为什么要赌你的代码正确?