将ConcurrentDictionary类型传递给一个接受IDictionary的函数是否安全?

时间:2017-09-05 18:00:43

标签: c# .net dictionary concurrency

我有一个方法:

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方法的签名。而且这种变化似乎在我的机器上运行良好。

然而,对于能够以相同的方式/方法填充常规字典和并发字典,我觉得不合适。

我在做什么安全?

1 个答案:

答案 0 :(得分:1)

这取决于你做了什么,在方法中,如果你只是使用索引操作修改字典,它应该没问题,因为索引设置的语义是添加或更新,字典应该以线程安全的方式执行此操作。 如果你的方法做了更复杂的事情,例如检查是否存在键,然后添加一个值(如果它不存在),那么如果多个线程正在写入字典,那么这可能会导致意外的结果(ConcurrentDictionary有专用用于添加或创建值的重载,这是原子的)

如果它添加到字典中然后期望从字典中读取值并且另一个线程修改相同的键,则您的方法也可能会混淆。

所以简短的回答是,通常应该没问题,但是如果没有考虑到线程安全性而创建方法,则需要分析并发问题的方法。