通常の辞書では、次のようなコードが表示される場合があります。
Dictionary<string, int> dictionary = GetDictionary();
if (dictionary.ContainsKey("MyKey"))
{
dictionary["MyKey"] += 5;
}
else
{
dictionary.Add("MyKey", 5);
}
これはスレッドセーフなコードではありません。複数の競合状態があります。"MyKey" は への呼び出し後に追加/削除される可能性がありContainsKey
、"MyKey" に関連付けられた値 (存在する場合) は、+=
演算子を使用して行の読み取りと代入の間で変更される可能性があります。
このメソッドは、キーが存在するかどうかに応じて、特定のキーに関連付けられた値を追加またはAddOrUpdate
更新するメカニズムを提供することにより、これらのスレッド化の問題を解決することを目的としています。これは、複数の操作 (この場合、キーをチェックし、キーの存在に応じて値を挿入または変更する) を組み合わせて、競合状態の影響を受けない 1 つの効果的なアトミック アクションにするという点で似ています。TryGetValue
これを具体的にするために、 を使用して上記のコードを修正する方法を次に示しますAddOrUpdate
。
ConcurrentDictionary<string, int> dictionary = GetDictionary();
// Either insert the key "MyKey" with the value 5 or,
// if "MyKey" is already present, increase its value by 5.
dictionary.AddOrUpdate("MyKey", 5, (s, i) => i + 5);