我有一个方法:将ConcurrentDictionary类型传递给一个需要IDictionary的函数是否安全?
void foo(IDictionary<string, object> data) {
data["key1"] = getValue1();
data["key2"] = getValue2();
}
我现在把它叫做如下:
var serialDict = new Dictionary<string, object>();
foo(serialDict);
现在我需要调用foo
与ConcurrentDictionary
类型,因为字典正在对多线程进行填充。
var concurrentDict = new Dictionary<string, object>();
foo(concurrentDict);
由于ConcurrentDictionary
器具IDictionary
,我没有改变foo
方法的签名。而且这一改变似乎在我的机器上运行良好。
但是,有些东西并不适合我,因为能够以相同的方式/方法填充常规字典和并发字典。
我在做什么安全?
我不明白为什么它不会好。 Concurrent Dict表示,它可以用于IDictionary的任何地方 - 它通过实现该接口来说明。 – pm100
什么操作下的“安全”?你的程序是在一个线程上添加这些键并在另一个线程上读取它们?你有订阅要求,读者在作家后面跑?因为这些不变量不是由您的代码维护的。在竞争条件下,并发字典**不会使您的进程**崩溃,但这并不意味着您的程序自动*正确*!你必须把字典看作*不断变化*,除非你编写了能够保持它不变的代码。 –
@EricLippert不是那些相同的键,我有订购说明。其他线程添加或编辑键,但不是这种方法中的键。 – AngryHacker