2013-07-17 31 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

不,因爲它不是記錄是安全的。這是真正的原因。推理與實施細節並不是很好,因爲他們是細節,你不能依靠。

相關問題