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

时间:2014-06-23 07:37:26

标签: c# .net 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
    }
}

1 个答案:

答案 0 :(得分:5)

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

always acquiring resources in same order

编辑:找到a stackoverflow question about this但仍没有针对此特定死锁预防机制的文章...

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

回到你的qeustion

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

编辑:问题编辑后

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

那么答案是肯定的!在方法Common中,锁定不是必需的。

注意:装饰方法

装饰我的意思是Decorator Pattern意义上的装饰。这意味着在某段代码之前和之后执行代码。在这种情况下,我的意思是方法内的代码。在java中存在一个synchronized关键字,它允许使用简短的手来使用封闭的实例对象使用synchronized块方便地装饰方法内的代码。 This is called a synchronized method