[英]Is it thread-safe to lock a .NET Dictionary on write, and read it lock-free?
我知道字典不是線程安全的。
但是為了簡單起見,我有時(當場景不太復雜時)將它們包裹在一個鎖周圍並在多線程環境中使用它,即使可以使用其他並發結構(例如: ConcurrentDictionary
)。
這是我正在做的一個例子:
public class Example
{
private object _sync = new object();
private Dictionary<string,stirng> _dictionary = new Dictionary<string,string> ();
public void Write (string key, stirng value)
{
lock(_sync)
{
if (_dictionary.ContainsKey(key) == false)
_dictionary.Add(key,value);
}
}
public string Read (string key)
{
if (_dictionary.ContainsKey(key))
return _dictionary[key];
return null;
}
}
恐怕連邊寫邊看字典,都可能產生不一致的數據。
我不害怕閱讀舊數據,也不害怕“看到”新數據(直到寫入結束),這在我的場景中是可以的。
即使新數據是唯一不一致的數據(直到寫操作結束)也沒關系。
我擔心的是字典結構在插入時可能位於可用的 state 中(因此,即使對於非常舊的密鑰而不僅僅是新密鑰,在那一刻的讀取也會產生完全混亂的結果)。
不,它不是線程安全的。 Dictionary<TKey,TValue>
對多個閱讀器來說是線程安全的,前提是它位於永久不可變(“凍結”)state 中。 如果要同時從多個線程讀取和寫入字典,則必須始終lock
所有操作(讀取和寫入),否則程序的行為是未定義的。
鎖定速度很快:在 2010 年代的計算機上,如果鎖沒有爭用,您可以期望在短短 20 納秒內獲取和釋放鎖。 因此,當應用的正確性受到威脅時,您不必過於擔心應用的性能。¹
¹鎖定速度很快,但並非沒有成本。 如果您的應用預計每秒對同一個字典執行數百萬次讀取和寫入操作,那么切換到ConcurrentDictionary<K,V>
很可能對您的應用性能有很大的好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.