【问题标题】:Can ReadOnlyDictionary be used when only the values are changing?只有值发生变化时可以使用 ReadOnlyDictionary 吗?
【发布时间】:2022-01-21 05:40:42
【问题描述】:

我知道ReadOnlyDictionary 在从多个线程访问时是“线程安全的”,只要集合没有改变。
但是如果集合没有改变(没有添加/删除键)并且值本身是线程安全的,这意味着引用不会改变,但值的内部数据可能(Value 对象本身是线程安全的) 例如

ReadOnlyDictionary<Key, ThreadSafe Value> dictionary = new...  
dictionary[key].inc()

其中inc()ThreadSafeValue 的线程安全方法。

由于集合本身没有改变,引用也没有改变,我认为这没问题,但由于 ReadOnlyDictionary 不公开 Add/Remove/Update 并且它不是线程安全的,我想知道我的假设是正确的

【问题讨论】:

  • ReadOnlyDictionary 仅与它包装的字典一样线程安全(请参阅stackoverflow.com/questions/13684143/…)。因此,这取决于下面使用的是什么字典实现。
  • 您可以将这个问题视为关于Dictionary 的问题,但没有添加/删除键.. 问题仍然存在,因为从文档中不清楚“更改集合”是什么意思
  • 在这种情况下,这可能会回答您的问题:Thread safety of a Dictionary<TKey, TValue>(但如果没有,请随时解释原因)。
  • 这个问题和回复谈到了一个字典,键和值都永远不会改变。我问的是一个字典,其中的键没有改变,但值数据(不是参考)可能会改变
  • 我想说,根据以前的 cmets,答案是“ReadOnlyDictionary 本身对情况的安全性没有影响”。所以,不知道你到底在问什么。

标签: c# multithreading thread-safety readonly-collection ireadonlydictionary


【解决方案1】:

您的问题似乎源于对字典上下文中“值”的混淆。

从字典的角度,假设ThreadSafeValue是一个引用类型,那么值就是对对象的引用。如果你从不修改字典,那么引用本身就永远不会改变。换句话说,键和值都不会改变。

如果ThreadSafeValue 本身是线程安全的,那么整个用例看起来是安全的。

【讨论】:

  • 不,这不是真的。线程安全不是从各部分的总和中获得的。只能从整体上衡量。就像说如果砖是实心的,那么如果你用砖造房子,那么房子也是实心的,这是错误的。事实并非如此。即使在线程安全集合中使用线程安全值,您编写的代码也可能使其不是线程安全的。
  • 这不是我说的。我刚刚谈到了这个特定的用例。
  • 是的,我也是。我的意思是,OP 显示的代码不足以为代码的使用方式建立线程安全性。除非实际提出具体的用例,否则这是一个有争议的问题。
  • 假设ThreadSafeValue的任何方法都是线程安全的,并且字典确实在被多个线程使用时永远不会改变,那么这里可能会出现什么线程安全问题?
【解决方案2】:

是的,你的假设是正确的。由于字典中存储的值是自主线程安全的,而且字典本身实际上是不可变的,因此整个数据结构是线程安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2013-04-22
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多