Roy*_*mir 5 .net c# multithreading locking .net-4.0
有人可以解释一下我们为什么需要嵌套锁定吗?
看看这个例子:
lock (locker)
lock (locker)
lock (locker)
{
...
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释(+例子将非常感谢).
Hen*_*man 13
有人可以解释一下我们为什么需要嵌套锁定吗?
这只是一个问题,因为您可能对需要锁定的方法进行了嵌套(例如,相互递归)调用.这些方法必须允许在资源已被锁定的情况下调用,但它们不能依赖它.所以允许嵌套锁定,不需要.
您发布的代码(以及您引用的书)通过将其缩减为内联方案来显示其工作原理.那不是'真正的'代码.
简单的规则是已经拥有锁的线程可以再次锁定它,并且退出的数量必须与Enters的数量相匹配才能释放锁.
在某些情况下,在同一个线程上嵌套锁的能力是否非常实用.
假设您有一个包含多种方法的类.假设您想要一个非常简单的锁定方案,如下所示:
class A
{
public void MethodOne()
{
using (locker)
{
...body...
}
}
public void MethodTwo()
{
using (locker)
{
...body...
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果MethodOne调用MethodTwo,MethodTwo如果监视器中没有可重入锁定功能,则在开始时会出现死锁.线程只会通过自己阻止自己locker.
幸运的是,这个例子只适用于.NET.锁定器"知道"哪个线程锁定了它以及它将允许(仅)拥有线程通过多少次.计数用于确保从其他等待线程的角度解锁仅在退出MethodOne时而不是在退出时发生MethodTwo.所以这是一个有用的嵌套锁定的例子.
另一方面,问题中提到的例子似乎来自本书.作者希望明确表示嵌套锁定可以在.NET中自动进行; 但他们的示例代码是设计的,并不打算出现在任何人的代码中,除非在试图了解锁定如何工作时.