关于 .net 中 Lock() 构造的两个问题
首先,我知道如果一个对象被锁定在一个类中,而另一个类试图锁定同一个对象,则会产生死锁。但为什么?我在 MSDN 上读过它,但 MSDN 很少那么清楚。
----编辑问题一---- 仍然很困惑。我有一个产生许多 Threadpool 线程的主线程(UI 线程)。每个子线程在使用数据之前都会锁定数据。这每次都很好。
如果我然后尝试从 UI 线程锁定相同的数据以检查我是否应该为边缘情况创建一个新线程,我几乎每次都会创建死锁。
----编辑问题二---- 其次,如果我有一个我锁定的复合对象,那么其中的所有子对象是否也被锁定?短代码演示:
internal sealed class Update
{
//Three objects instantiated via other external assemblies
public DataObject One { get; set; }
public DataObject Two { get; set; }
public ReplayStatus Status { get; set; }
}
如果我调用 lock(UpdateObject) 三个内部对象中的每一个以及所有子对象都被锁定了吗?
所以我应该做这样的事情来防止线程玩我的数据对象:
Lock(UpdateObject.One)
{
Lock(UpdateObject.Two)
{
Lock(UpdateObject.Status)
{
//Do Stuff
}
}
}