我想知道这是一个糟糕的代码设计,在同一个方法中使用2个单独的锁。我相信这两个锁首次实现的原因是他们更新的字段是无关的。
public class MyClass
{
private readonly object _lock = new object();
private readonly object _lock2 = new object();
public async Task DoStuff()
{
lock(_lock)
{
//do some stuff
}
lock(_lock2)
{
//do some other stuff
}
}
}
我们假设_lock
仅用于修改int
变量,_lock2
用于修改List<string>
变量。可以从不同线程上的类中的其他方法调用这两个锁。这里有死气味吗?似乎我应该重构这个,所以DoStuff
方法应该只使用一种锁类型。
答案 0 :(得分:4)
如果两个代码块可以从不同的调用同时运行,那么将lock
打开两个对象就没有问题。如果重要两个块能够同时运行,则做必须具有lock
开启的不同对象。如果重要的是两个块实际上不是同时运行,并且整个操作被视为一个逻辑原子操作,那么你应该使用一个lock
。
这两个选项具有完全不同的语义,既不是天生错误也不是固有的正确。您需要使用正确的情况来处理您所处的情况。
答案 1 :(得分:0)
该代码是死锁安全的。当锁定会阻止已经在关键部分中的线程离开它时,此代码中没有任何情况。因此,该线程将始终释放另一个线程的获取锁