双锁的特定情况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:第一个锁只用于这种特殊情况
"Best"是主观的,取决于上下文。这两种方法的一个问题是,如果某些代码以不同的顺序使用相同的锁,则可能存在死锁的风险。如果您有嵌套锁,那么我个人至少会使用带超时的锁(并引发异常)——异常比死锁要好。立即取出这两个锁的好处是,在您开始工作之前,您知道您可以取出它们。不这样做的好处是可以减少lockObject2
上的锁被持有的时间。
就我个人而言,我会寻找方法来实现它:
lock (lockObject) {
//critical portion for lockObject
}
lock (lockObject2) {
//critical portion for lockObject2
}
这具有两者的优点,而没有两者的缺点- 如果您可以重构代码来实现
这取决于你所面对的情况:
- 如果有可能第一个锁被释放而不触及第二个锁,它可能会加速你的应用程序,因为第二个锁不会被锁定而不被使用。
- 如果总是使用两个锁,我更喜欢第一个情况的可读性
我说错话了。第一个将锁定第一个锁,然后锁定代码部分的第二个锁,然后自动解锁。第二个例子将锁定第一个,然后锁定第二个,然后代码的两个部分都结束了,都解锁了。就我个人而言,我更喜欢第二个选项,因为它会自动解锁两个锁。但正如其他人评论的那样,要小心死锁。如果另一个线程以相反的顺序锁定,则可能发生这种情况。