private object lockObj = new object();
private Dictionary<int, string> dict = new Dictionary<int, string>();
public string GetOrAddFromDict(int key)
{
string value;
// non-locked access:
if (dict.TryGetValue(key, out value))
return value;
lock (this.lockObj)
{
if (dict.TryGetValue(key, out value))
return value;
string newValue = "value of " + key; // place long operation here
dict.Add(key, newValue);
return newValue;
}
}
質問:スレッドセーフですか?はいの場合、なぜですか?このロックされていないTryGetValue()辞書アクセスはスレッドセーフですか?
質問b:このdouble-TryGetValue()パターンはどのように呼び出されますか?
サイドノート。ダブルチェックされたロック*のパターンは、 'Hashtable'に対して明示的に安全です。それが辞書にとって安全かどうかは不明です。 –