単純な型をリストにマップする ConcurrentDictionary があります。
var dict = new ConcurrentDictionary<string, List<string>>();
AddOrUpdate()を使用して、最初の値が追加されたときのリストの初期化と、リストへの後続の値の追加の両方に対応できます。
ただし、削除については同じではありません。私が次のようなことをした場合:
public void Remove(string key, string value)
{
List<string> list;
var found = dict.TryGetValue(key, out list);
if (found)
{
list.Remove(value);
if (list.Count == 0)
{
// warning: possible race condition here
dict.TryRemove(key, out list);
}
}
}
...対応するリストに値がなくなった場合にキーを完全に削除することを意図している場合(概念的には参照カウントに似ています)、誰かが直後にリストに何かを追加した可能性があるため、競合状態のリスクがあります空かどうかを確認しました。
この単純な例ではリストを使用していますが、通常、そのようなシナリオでは ConcurrentBag または ConcurrentDictionary を使用しており、リスクは非常に似ています。
対応するコレクションが空の場合、ロックに頼らずにキーを安全に削除する方法はありますか?