如何在.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

10-06 06:25