由于 IDictionary 没有 GetOrAdd 和 AddOrUpdate 方法,从 ConcurrentDictionary 到 IDictionary 的转换是否会切断线程安全的实现?
问问题
2321 次
5 回答
10
结果对象仍然是并发字典。Add 或 Remove 之类的调用使用底层实现 TryAdd 和 TryRemove(它们是线程安全的)。将对象转换为不同的类型不会改变对象本身。
此外,为了澄清起见,您可以使用 ILSpy 之类的工具来查看默认 IDictionary 方法的实现是什么,以及它们是否仍然是线程安全的。
于 2012-04-11T19:04:40.370 回答
6
IDictionary
只是一个界面。如果你转换为它,结果是 ConcurrentDictionary 的实现,缺少GetOrAdd
andAddOrUpdate
方法。
据推测,您仍然可以使用Item
property 和 Add
andContainsKey
方法(代替GetOrAdd
and AddOrUpdate
)方法,并且您的转换对象仍然是线程安全的(因为底层实现是 a ConcurrentDictionary
)。
于 2012-04-11T19:02:30.753 回答
0
这就像ConcurrentDictionary
通过形状的钥匙孔看大物体IDictionary
- 你只能看到IDictionary
形状,但它仍然是ConcurrentDictionary
。
于 2012-04-11T19:11:30.593 回答
-2
简短的回答没有。
您正在通过接口操作对象,因此仍在使用具体实现。您不会丢失任何功能或其方法。它们只是不可用。
在旁注中,向下转换时需要显式转换,向上转换时不需要显式转换 - 这样做总是安全的。
于 2012-04-11T19:20:39.613 回答