.NETでコピーオンライトモデルを使用してスレッドセーフリストを作成する方法は?
以下は私の現在の実装ですが、スレッド化、メモリバリアなどについてたくさん読んだ後、ロックのないマルチスレッド化が関係する場合は注意が必要であることがわかりました。これが正しい実装であるかどうか、誰かがコメントできますか?
class CopyOnWriteList
{
private List<string> list = new List<string>();
private object listLock = new object();
public void Add(string item)
{
lock (listLock)
{
list = new List<string>(list) { item };
}
}
public void Remove(string item)
{
lock (listLock)
{
var tmpList = new List<string>(list);
tmpList.Remove(item);
list = tmpList;
}
}
public bool Contains(string item)
{
return list.Contains(item);
}
public string Get(int index)
{
return list[index];
}
}
編集
より具体的には、上記のコードはスレッドセーフですか、それとも何か追加する必要がありますか? また、最終的にすべてのスレッドで参照が変更されるのlist
でしょうか? volatile
または、リスト フィールドにキーワードを追加するか、Contains メソッドに参照へのアクセスとそのメソッドの呼び出しの間に Thread.MemoryBarrier を追加する必要がありますか?
たとえば、Java 実装は上記のコードのように見えますが、そのようなアプローチは .NET でもスレッドセーフですか?
そして、これは同じ質問ですが、Javaでもあります。
これに関連する別の質問があります。