在同一方法中有2个锁的不良做法?

时间:2017-01-10 18:20:11

标签: c# multithreading locking deadlock

我想知道这是一个糟糕的代码设计,在同一个方法中使用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方法应该只使用一种锁类型。

2 个答案:

答案 0 :(得分:4)

如果两个代码块可以从不同的调用同时运行,那么将lock打开两个对象就没有问题。如果重要两个块能够同时运行,则必须具有lock开启的不同对象。如果重要的是两个块实际上不是同时运行,并且整个操作被视为一个逻辑原子操作,那么你应该使用一个lock

这两个选项具有完全不同的语义,既不是天生错误也不是固有的正确。您需要使用正确的情况来处理您所处的情况。

答案 1 :(得分:0)

该代码是死锁安全的。当锁定会阻止已经在关键部分中的线程离开它时,此代码中没有任何情况。因此,该线程将始终释放另一个线程的获取锁