如何在.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 implementation,看起来像我上面的代码,但是这种方法在.NET中也是线程安全的吗?
和here是相同的问题,但是在Java中也是如此。
Here是与此问题相关的另一个问题。
最佳答案
实现是正确的,因为根据Atomicity of variable references引用分配是原子的。我将volatile
添加到list
。