这种嵌套锁定会导致死锁吗?

sun*_*dar 2 .net c# multithreading locking

Method1和Method2是公共方法.这两种方法都需要以相同的顺序接受两个锁.我确定以相同的顺序获取锁定不会导致死锁.锁是Common()不必要的?

public void Method1()
{
    lock(LockObjA)
    lock(LockObjB)
    {
        //DoSomething
        Common();
    }
}

public void Method2()
{
    lock(LockObjA)
    lock(LockObjB)
    {
        //DoSomething else
        Common();
    }
}

private void Common()
{
    lock(LockObjA)
    lock(LockObjB)
    {
        //DoSomething else
    }
}
Run Code Online (Sandbox Code Playgroud)

isa*_*s-b 5

我无法找到关于匆忙的更好的参考,但我可以很好地记住我的操作系统课程资源锁定,其中教授表示总是以相同的顺序获取资源不会增加发生死锁的机会.

总是以相同的顺序获取资源

编辑:发现有关此问题的stackoverflow问题,但仍然没有针对此特定死锁预防机制的文章...

由于c#锁是可重入的,因此在使用代码时不应该造成更多伤害.

回到你的qeustion

如果所有方法都是私有的,那么在类中有一个非常小的范围来检查锁定条件.因此,在公共API上,最好装饰所有使用锁更改可变状态的方法.即使这意味着他们可能会重新进入同一个锁两次.在私有API中,您可以决定是否合适.

编辑:在Qestion Edit之后

如果您拥有的三种方法是您的范围中唯一的方法,或者三种方法是唯一的关键方法(修改/访问可变状态).而且你可以看到更多的事情可以打破锁定.

然后答案是肯定的!在方法中Common,锁定不是必需的.

注意:装饰方法

装饰我的意思是装饰图案意义上的装饰.这意味着在某段代码之前和之后执行代码.在这种情况下,我的意思是方法内的代码.在java中,存在一个synchronized关键字,它允许使用简短的手来使用封闭的实例对象使用synchronized块方便地装饰方法内的代码.这称为同步方法.