【发布时间】:2012-04-10 07:12:56
【问题描述】:
假设我在一个类中有一个列表,它将用于多线程场景。
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 在这种特定情况下这不是问题,因为我只关心列表本身。如果需要,对象可以自行处理同步。
-
@HenkHolterman 我知道我可以使用任何对象,但我想知道使用列表的同步对象是否更好。我的意思是这就是它暴露的原因,不是吗?!
-
这个站点有一组很棒的多线程章节:albahari.com/threading
标签: c# .net multithreading thread-safety