2

应用双重检查锁定是否安全Dictionary

TryGetValue即,从不同线程调用和其他“获取/包含”方法是否安全?(不调用其他非 get 方法)。

upd收藏对 N 个读者和 1 个作者来说是安全的吗?假设在循环 10 中,线程尝试使用双重检查锁定访问带有键 X 的元素,如果访问,它们只是将其删除。在某些时候,我确实从另一个线程添加了带有键 X 的元素(使用锁)。我希望只有一位读者应该获得此元素并将其删除。

upd2,关于答案,所以我的问题令人困惑。其实我问了两个问题:

  1. TryGetValue从不同线程调用和其他“获取/包含”方法是否安全?(不调用其他非 get 方法)。
  2. 收藏对 N 位读者和 1 位作者来说是安全的吗?

第一个问题的答案是肯定的,第二个问题的答案是否定的。

所以有时它是安全的,apply double-checked locking有时它不是。这取决于您是否同时写入集合。

4

2 回答 2

3

我假设你在谈论泛型Dictionary<TKey, TValue>类。该课程对 N 个读者或 1 个作者是安全的。因此,只要您不修改它,您就可以拥有想要从中读取的任意数量的线程,而无需锁定。

如果线程可能要修改字典,则必须同步对它的访问。我建议ReaderWriterLockSlim

于 2012-12-29T21:11:58.750 回答
1

这是不安全的,因为它没有被证明是安全的。你不能有一个作者和 N 个读者。

这是文档中的一个适用句子:

只要不修改集合,字典就可以同时支持多个阅读器。

实际上,如果您使用 Reflector 查看 Dictionary,您会发现它是不安全的,但这不是重点。关键是您不能依赖未记录的属性,因为它们可以随时更改,将错误引入生产中,而没人知道。

您也无法测试它是否安全。它可能适用于您的盒子并在其他地方损坏。这是线程错误的本质。不值得。

于 2012-12-29T21:54:41.293 回答