2013-07-17 26 views
0

我的工作让我的SortedDictionary线程安全的事情我不知道的是:这是安全的,有一个呼叫添加到SortedDictionary在一个线程,就像这样:在一个线程中调用Add on SortedDictionary并在另一个线程中获取Item是否安全?

dictionary.Add(key, value); 

和简单得到这个字典中的项目在另一个线程,就像这样:

variable = dictionary[key]; 

没有在任何其他地方也没有明确的列举,所以看起来安全的,但将是巨大的,以确保它。

回答

1

不,同时读写SortedDictionary<K,V>并不安全:将元素添加到已排序的字典中可能涉及树的重新平衡,这可能会导致并发读取操作在导航到元素时进行错误的转向出于兴趣。

为了解决这个问题,您需要将一个SortedDictionary<K,V>的实例包装在执行显式锁定的类中,或者滚动您自己的兼容SortedDictionary<K,V>实现的接口的集合。

0

不,这样做不安全。如果你想在多线程中实现比你应该这样做

private readonly object lockObject = new object(); 
lock (lockObject) 
    { 
     //your dictionary operation here. 
    } 
1

没有任何修改树的任何东西都不是线程安全的。诀窍是在一个线程中填充SortedDictionary,然后将其视为不可变,并让多个线程从中读取它们。 (你可以用一个SortedDictionary做到这一点,如前所述here。我提到这一点,因为有可能是一个收集/词典/地图就在某个地方时,读它是改变了,所以你应该总是检查。)

如果你需要修改它,那么它就会出现问题。你需要锁定它来写信给它,所有的读者都需要尊重这个锁,这意味着他们也需要锁定它,这意味着读者不能再同时阅读它。 围绕这个的最佳方式通常是创建一个全新的SortedDictionary,然后,一旦新的不可变,就将引用替换为引用新引用。 (你需要一个不稳定的参考来做这件事。)读者会毫无问题地干净地切换字典。直到最后的读者完成阅读并发布其参考,旧字典才会消失。

(有n个阅读器和1作家锁,但要避免任何锁定的。)

(并牢记参考字典可以突然改变,如果你列举。使用一个局部变量,而不是引用(volatile)引用。)

Java有一个ConcurrentSkipListMap,它允许任意数量的同时读写操作,但我不认为在.NET中有这样的东西。如果有的话,它的读取速度会比不可变的SortedDictionary慢。

1

不,因为它不是记录是安全的。这是真正的原因。推理与实施细节并不是很好,因为他们是细节,你不能依靠。

相关问题