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)
我无法找到关于匆忙的更好的参考,但我可以很好地记住我的操作系统课程资源锁定,其中教授表示总是以相同的顺序获取资源不会增加发生死锁的机会.
编辑:发现有关此问题的stackoverflow问题,但仍然没有针对此特定死锁预防机制的文章...
由于c#锁是可重入的,因此在使用代码时不应该造成更多伤害.
回到你的qeustion
如果所有方法都是私有的,那么在类中有一个非常小的范围来检查锁定条件.因此,在公共API上,最好装饰所有使用锁更改可变状态的方法.即使这意味着他们可能会重新进入同一个锁两次.在私有API中,您可以决定是否合适.
编辑:在Qestion Edit之后
如果您拥有的三种方法是您的范围中唯一的方法,或者三种方法是唯一的关键方法(修改/访问可变状态).而且你可以看到更多的事情可以打破锁定.
然后答案是肯定的!在方法中Common,锁定不是必需的.
注意:装饰方法
装饰我的意思是装饰图案意义上的装饰.这意味着在某段代码之前和之后执行代码.在这种情况下,我的意思是方法内的代码.在java中,存在一个synchronized关键字,它允许使用简短的手来使用封闭的实例对象使用synchronized块方便地装饰方法内的代码.这称为同步方法.