我们有这个共享列表,其中“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从程序开始就是不可变的,那么删除锁是否安全?
答案 0 :(得分:1)
如果fooList
确实在创建后从未被修改过,那么当您从中读取值时不需要锁定。这包括使用foreach
。
如果在创建后确实永远不会修改fooList
,那么为什么不使用ReadOnlyCollection<Foo>
而不是List<Foo>
。这是一种更具说明性和可执行性的创建不会更改的列表的方法。它可以保护您免受未来列表的意外突变