线程之间共享List <reading_only_object>:单个线程中的白色是否可以安全地实例化引用相同元素的列表?</reading_only_object>

时间:2013-08-25 02:21:47

标签: c# multithreading locking

我们有这个共享列表,其中“MyObject”表示一个类,其对象在创建后无法修改

List<MyObject> fooList;

当在fooList上调用.add或.remove方法(这是唯一可以改变fooList的东西)时,fooList被锁定(Monitor.TryEnter ...)

每个线程可以在访问它时执行此操作,同时还锁定fooList:

foreach (MyObject o in fooList)
{
    myList.Add(o);
}

foreach (MyObject o in myList)
{
    Console.WriteLine(o.ToString());
}

假设存在锁只是为了确保在foreach迭代正在进行时fooList不会调用任何.add或.remove方法(从而使其无效)是否正确?

换句话说,如果fooList从程序开始就是不可变的,那么删除锁是否安全?

1 个答案:

答案 0 :(得分:1)

如果fooList确实在创建后从未被修改过,那么当您从中读取值时不需要锁定。这包括使用foreach

如果在创建后确实永远不会修改fooList,那么为什么不使用ReadOnlyCollection<Foo>而不是List<Foo>。这是一种更具说明性和可执行性的创建不会更改的列表的方法。它可以保护您免受未来列表的意外突变