我读过几篇文章和文章说lock(this)lock(typeof(MyType))lock("a string")都是不好的做法,因为另一个线程可能会锁定相同的键并导致死锁。为了理解此问题,我试图创建一些示例代码来说明僵局,但一直无法解决这个问题。

有人可以写出简短的代码来说明这个经典问题吗?请保持简短,我只能摘要较小的代码。

编辑:
我认为lassevk很好地总结了这一点。真正的问题是您失去了对锁的控制权。一旦发生这种情况,您将无法控制调用锁的顺序,并允许出现潜在的死锁情况。
lock(this)lock(typeof(MyType))等都是在您选择了无法控制的锁的情况下。

最佳答案

仅当您拥有多个锁时,才会发生死锁。您需要一个情况,即两个线程都拥有另一个线程需要的资源(这意味着必须至少有两个资源,并且两个线程必须尝试以不同的顺序来获取它们)

举个简单的例子:

// thread 1
lock(typeof(int)) {
  Thread.Sleep(1000);
  lock(typeof(float)) {
    Console.WriteLine("Thread 1 got both locks");
  }

}

// thread 2
lock(typeof(float)) {
  Thread.Sleep(1000);
  lock(typeof(int)) {
    Console.WriteLine("Thread 2 got both locks");
  }
}

假设两个线程在彼此之间的一秒内启动,那么在任何人进入内部锁之前,它们都将有时间捕获第一把锁。如果没有Sleep()调用,则其中一个线程很可能有时间在另一个线程甚至没有启动之前就获得和释放这两个锁。

关于c# - 示例代码通过使用锁来说明死锁(this),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/894037/

10-12 21:57
查看更多