我有一個靜態System.Collections.Generic.Dictionary<K, V>
用作緩存。在高速緩存未命中我做了一些昂貴的工作,以獲取指定鍵的值,並將其保存在緩存中:使用相同的鍵/值更新字典從多個線程安全嗎
private static Dictionary<K, V> _cache = ...
public static V GetValue<K>(K key)
{
V value;
if (!_cache.TryGetValue(key, out value))
{
value = GetExpensiveValue(key);
_cache[key] = value; // Thread-safety issue?
}
return value;
}
這是一個常見的模式。問題是:這是安全的還是在多線程嘗試同時調用GetValue()
時會失敗?
假設GetExpensiveValue
總是返回給定鍵的相同值,我並不關心哪個線程贏得競爭條件。是的,這意味着昂貴的操作可能會比需要的時間多一次,但這是一個折衷,如果讀取比寫入更頻繁,這可以讓我滿意,這可以讓我消除鎖定。但是,在字典裏面會出現什麼問題?也就是說,在某些情況下會拋出異常還是破壞其數據?我用一個簡單的控制檯應用測試了這一點,發現沒有問題,但當然,這並不意味着它將始終工作。
這並不安全; TryGetValue *本身*不是線程安全的,並且如果字典正在被另一個線程突變,可能會在火花陣中爆炸 – 2010-11-24 06:28:59