嵌套锁定在c#中的误解?

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的数量相匹配才能释放锁.

  • @RoyiNamir从书中可以看出:"一个线程*可以*以嵌套(可重入)方式重复锁定同一个对象",这意味着您可以多次锁定互斥锁,但不是必需的. (3认同)

Jir*_*ika 5

在某些情况下,在同一个线程上嵌套锁的能力是否非常实用.

假设您有一个包含多种方法的类.假设您想要一个非常简单的锁定方案,如下所示:

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中自动进行; 但他们的示例代码是设计的,并不打算出现在任何人的代码中,除非在试图了解锁定如何工作时.