繁体   English   中英

对字典应用双重检查锁定是否安全?

[英]is it safe to apply double-checked locking to Dictionary?

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

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

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

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

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

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

因此,有时apply double-checked locking是安全的,有时则不然。 这取决于您是否同时在写一个集合。

我假设您正在谈论通用的Dictionary<TKey, TValue>类。 该课程对N位读者或1位作家而言是安全的。 因此,只要您不修改它,就可以拥有想要从中读取的尽可能多的线程,而无需锁定。

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

这是不安全的,因为它没有记录为安全的。 您不能有一个作家和N个读者。

这是文档中适用的句子:

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

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

您也不能对此进行安全性测试。 它可能会在您的盒子上工作,并在其他地方损坏。 这就是线程错误的本质。 不值得。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM