[英]is it safe to apply double-checked locking to Dictionary?
将双重检查锁定应用于Dictionary
是否安全?
即从其他线程调用TryGetValue
和其他“获取/包含”方法是否安全? (无需调用其他非get方法)。
upd对于N位读者和1位作家来说,收藏安全吗? 假设在第10个周期中,线程尝试使用双重检查的锁定来访问具有键X的元素,如果访问,则将其删除。 在某些时候,我确实从另一个线程(使用锁)中添加了带有键X的元素。 我希望恰好有一个读者应该获取此元素并将其删除。
upd2,关于答案,所以我的问题令人困惑。 实际上我问了两个问题:
TryGetValue
和其他“获取/包含”方法? (无需调用其他非get方法)。 第一个问题的答案为是,第二个问题的答案为否。
因此,有时apply double-checked locking
是安全的,有时则不然。 这取决于您是否同时在写一个集合。
我假设您正在谈论通用的Dictionary<TKey, TValue>
类。 该课程对N位读者或1位作家而言是安全的。 因此,只要您不修改它,就可以拥有想要从中读取的尽可能多的线程,而无需锁定。
如果线程可能要修改字典,则必须同步对其的访问。 我建议ReaderWriterLockSlim 。
这是不安全的,因为它没有记录为安全的。 您不能有一个作家和N个读者。
这是文档中适用的句子:
词典可以同时支持多个阅读器,只要不修改集合即可。
实际上,如果您查看带有Reflector的Dictionary,您会发现它是不安全的,但这不是重点。 关键是您不能依赖未记录的属性,因为它们可以随时更改,从而将错误引入生产中,而没人知道。
您也不能对此进行安全性测试。 它可能会在您的盒子上工作,并在其他地方损坏。 这就是线程错误的本质。 不值得。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.