1

我很难从这两种方法中进行选择,这里的许多答案都偏向其中一种。我需要一个指导来选择最适合我的情况。

lock (lockObject)
lock (lockObject2) {
     // two critical portions of code
}

相对:

lock (lockObject)
{
    //first critical portion for lockObject 
    lock (lockObject2) {
       //critical portion for lockObject2 and lockObject
    }
}

第二个示例被 Coverity 标记为不好的做法,如果可以这样做,我想切换到第一个示例。

两者中哪一个是最好的(最好的意思是代码质量和从长远来看问题更少)?为什么?

编辑 1:第一个锁仅用于这种情况。

4

3 回答 3

2

“最佳”是主观的,取决于上下文。两者的一个问题是,如果某些代码以不同的顺序使用相同的锁,您可能会面临死锁的风险。如果您有嵌套锁,那么我个人至少会使用超时锁(并引发异常) - 异常比死锁更好。立即取出两把锁的好处是,在您开始工作之前,您知道可以拿到它们。这样做的好处是可以减少保持锁定的时间lockObject2

就个人而言,我会寻找方法来实现它:

lock (lockObject) {
    //critical portion for lockObject
}
lock (lockObject2) {
    //critical portion for lockObject2
}

这具有两者的优点,没有任何一个缺点 -如果您可以重组代码来做到这一点。

于 2013-05-23T08:27:21.230 回答
1

取决于您面临的情况:

  • 如果有可能在不触及第二个锁的情况下释放第一个锁,则可能会加速您的应用程序,因为第二个锁不会在不使用的情况下被锁定。
  • 如果总是使用两个锁,我会更喜欢第一种情况以提高可读性

编辑:我认为如果没有更多信息就不可能说出来。为了使锁尽可能短,您需要尽可能晚地锁定。无论如何,您可能希望同时获得两个锁。

于 2013-05-23T08:28:51.373 回答
0

编辑:我说错了。第一个将锁定第一个锁,然后为代码部分锁定第二个锁,然后自动解锁。第二个示例将锁定第一个,然后锁定第二个,然后代码的两个部分都已结束,都已解锁。我个人更喜欢第二种选择,因为它会自动解锁两个锁。但正如其他人评论的那样,请注意死锁。如果另一个线程以相反的顺序锁定,就会发生这种情况。

于 2013-05-23T08:25:05.573 回答