如何在 .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
在列表字段或 Thread.MemoryBarrier 中添加关键字访问引用和调用它的方法之间的包含方法?
这是例如Java实现,看起来像我上面的代码,但是这种方法在.NET中也是线程安全的吗?
这是同样的问题,但在 Java 中也是如此。
这是与此相关的另一个问题。