Rit*_*itz 3 .net c# multithreading
关于.net中的Lock()构造的两个问题
首先,我知道如果一个对象被锁定在一个类中,而另一个类试图锁定同一个对象,则会产生死锁.但为什么?我在MSDN上看过它,但MSDN很少清楚.
----编辑问题一----仍然困惑.我有一个主线程(UI线程),产生许多Threadpool线程.每个子线程在使用数据之前锁定数据.这样每次都很好.
如果我然后尝试从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; }
}
Run Code Online (Sandbox Code Playgroud)
如果我调用lock(UpdateObject)是三个内部对象中的每一个,并且所有子对象都被锁定了?
所以我应该做这样的事情来防止线程与我的数据对象一起玩:
Lock(UpdateObject.One)
{
Lock(UpdateObject.Two)
{
Lock(UpdateObject.Status)
{
//Do Stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我知道如果一个对象被锁定在一个类中,而另一个类试图锁定同一个对象,则会产生死锁.
否.如果一个线程锁定一个对象而另一个线程试图锁定该对象,则该第二个线程必须等待第一个线程退出该锁.
死锁是别的东西:
1. thread1 locks instanceA
2. thread2 locks instanceB
3. thread1 attempts to lock instanceB and now must wait on thread2
4. thread2 attempts to lock instanceA and now must wait on thread1
Run Code Online (Sandbox Code Playgroud)
这两个线程不能再执行,因此永远不会释放它们的锁.真是一团糟.
如果我调用lock(UpdateObject)是三个内部对象中的每一个,并且所有子对象都被锁定了?
不,"锁定"仅在锁定的实例上.注意:锁定不会阻止除第二个线程以外的任何内容同时获取该实例上的锁定.
| 归档时间: |
|
| 查看次数: |
741 次 |
| 最近记录: |