假设我在一个将在多线程场景中使用的类中有一个列表。以线程安全的方式枚举列表
public class MyClass
{
List<MyItem> _list= new List<MyItem>();
protected object SyncRoot {
get {
return ((IList)_list).SyncRoot;
}
}
public void Execute1()
{
lock(SyncRoot)
{
foreach(var item in _list) DoSomething(item);
}
}
public void Execute2()
{
Item[] list;
lock(SyncRoot)
{
list=_list.ToArray();
}
for(var i=0;i<list.Length;i++) DoSomething(list[i]);
}
}
的方法Execute1是“正常”的方式来枚举一个线程安全的方式列表。但是Execute2?这种方法仍然是线程安全的吗?
不,如果MyItems是引用类型(对象),Execute2是不安全的,因为列表和数组最终都指向相同的对象。 – Will 2012-04-10 07:34:17
@Will这在这个特定的场景中不是问题,因为我只关心列表本身。如果需要的话,这些对象可以自己处理同步。 – MikeSW 2012-04-10 07:52:05
@HenkHolterman我知道我可以使用任何对象,但我想知道是否最好使用列表的同步对象。我的意思是这就是为什么它暴露,不? – MikeSW 2012-04-10 07:53:45