好吧,这是我的属性(property)
public List<String> names{
get{
lock(_names)
return _names;
}
set{
lock(_names)
_names = value
}
}
private List<String> _names;
现在假设我对这样的名称执行 foreach
foreach(String s in names)
{
Console.WriteLine(s);
}
我的问题是,names 是通过整个 foreach 锁定的,还是每次 s 都只lock > 已设置,然后在 foreach 中解锁。
如果这令人困惑,就说我尝试这样做
foreach(String s in names)
{
lock(names)
Console.WriteLine(s);
}
我会陷入僵局吗?
请您参考如下方法:
lock(_names) return _names;
是以下的缩写:
try
{
Monitor.Enter(_names);
return _names;
}
finally
{
Monitor.Exit(_names);
}
相当于:
Monitor.Enter(_names);
Monitor.Exit(_names);
return _names;
这样看应该更清楚锁是不必要的。 您可能有兴趣使用 thread-safe collections 之一
