只有值在变化时可以使用 ReadOnlyDictionary 吗?
Can ReadOnlyDictionary be used when only the values are changing?
我知道 ReadOnlyDictionary
从多线程访问时是“线程安全的”,只要集合不变即可。
但是如果集合没有改变(没有键永远 added/removed)并且值本身是线程安全的,这意味着引用不会改变,但值的内部数据可能(Value
对象本身是线程安全的)
例如
ReadOnlyDictionary<Key, ThreadSafe Value> dictionary = new...
dictionary[key].inc()
其中inc()
是ThreadSafeValue
的线程安全方法。
由于集合本身没有改变,引用也没有改变,我认为这没问题,但由于 ReadOnlyDictionary 不公开 Add/Remove/Update 并且它不是线程安全的,我想知道如果我的假设是正确的
您的问题似乎源于对字典上下文中“值”的含义的混淆。
从字典的角度来看,假设ThreadSafeValue
是一个引用类型,那么这个值就是对对象的引用。如果你从不修改字典,那么引用本身就永远不会改变。换句话说,键和值都没有改变。
如果 ThreadSafeValue
本身是线程安全的,那么整个用例就显得安全。
是的,你的假设是正确的。由于存储在字典中的值是自主线程安全的,并且字典本身实际上是不可变的,因此整个数据结构是线程安全的。
我知道 ReadOnlyDictionary
从多线程访问时是“线程安全的”,只要集合不变即可。
但是如果集合没有改变(没有键永远 added/removed)并且值本身是线程安全的,这意味着引用不会改变,但值的内部数据可能(Value
对象本身是线程安全的)
例如
ReadOnlyDictionary<Key, ThreadSafe Value> dictionary = new...
dictionary[key].inc()
其中inc()
是ThreadSafeValue
的线程安全方法。
由于集合本身没有改变,引用也没有改变,我认为这没问题,但由于 ReadOnlyDictionary 不公开 Add/Remove/Update 并且它不是线程安全的,我想知道如果我的假设是正确的
您的问题似乎源于对字典上下文中“值”的含义的混淆。
从字典的角度来看,假设ThreadSafeValue
是一个引用类型,那么这个值就是对对象的引用。如果你从不修改字典,那么引用本身就永远不会改变。换句话说,键和值都没有改变。
如果 ThreadSafeValue
本身是线程安全的,那么整个用例就显得安全。
是的,你的假设是正确的。由于存储在字典中的值是自主线程安全的,并且字典本身实际上是不可变的,因此整个数据结构是线程安全的。