双锁的特定情况c#

本文关键字:情况 | 更新日期: 2023-09-27 18:15:02

我很难从这两种方法中做出选择,这里的许多答案都倾向于其中一种。我需要一个指导,以选择最适合我的情况。

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:第一个锁只用于这种特殊情况

双锁的特定情况c#

"Best"是主观的,取决于上下文。这两种方法的一个问题是,如果某些代码以不同的顺序使用相同的锁,则可能存在死锁的风险。如果您有嵌套锁,那么我个人至少会使用带超时的锁(并引发异常)——异常比死锁要好。立即取出这两个锁的好处是,在您开始工作之前,您知道您可以取出它们。这样做的好处是可以减少lockObject2上的锁被持有的时间。

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

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

这具有两者的优点,而没有两者的缺点- 如果您可以重构代码来实现

这取决于你所面对的情况:

  • 如果有可能第一个锁被释放而不触及第二个锁,它可能会加速你的应用程序,因为第二个锁不会被锁定而不被使用。
  • 如果总是使用两个锁,我更喜欢第一个情况的可读性
编辑:如果没有更多的信息,我认为这是不可能的。为了使锁尽可能短,您需要尽可能晚地锁。无论如何,在某些情况下,您可能希望同时获得两个锁。

我说错话了。第一个将锁定第一个锁,然后锁定代码部分的第二个锁,然后自动解锁。第二个例子将锁定第一个,然后锁定第二个,然后代码的两个部分都结束了,都解锁了。就我个人而言,我更喜欢第二个选项,因为它会自动解锁两个锁。但正如其他人评论的那样,要小心死锁。如果另一个线程以相反的顺序锁定,则可能发生这种情况。