死锁c#解决方案

时间:2010-06-23 06:48:08

标签: c# multithreading locking

大家好,我正在提高我对多线程C#的了解,并想知道如何解决这个经典的死锁问题。

public class SomeClass
{
    private object _lock1 = new object();
    private object _lock2 = new object();


    public void Method1()
    {
        lock (_lock1)
        {
            Thread.Sleep(10000);
            lock (_lock2)
            {
                Thread.Sleep(10000);
            }
        }
    }

    public void Method2()
    {
        lock (_lock2)
        {
            Thread.Sleep(10000);
            lock (_lock1)
            {
                Thread.Sleep(10000);
            }
        }
    }
}

如果两个线程同时运行,则存在死锁的风险。

谢谢

3 个答案:

答案 0 :(得分:2)

  • 以一致的顺序取得锁定
  • 尽可能保持锁定
  • 使用不可变数据结构尽可能避免锁定
  • 使用Monitor.TryEnter而不是lock(不会超时)

答案 1 :(得分:2)

这不是C#问题,它更为通用。 你的例子显然不正确。 尽量避免锁定imbrication是你最终陷入僵局的常见模式。 有一本关于同步的好书:  http://greenteapress.com/semaphores/

答案 2 :(得分:0)

您必须始终以相同的顺序获取锁定:首先锁定一个,然后锁定两个,依此类推。 您不需要总是占用所有锁:例如,您可以让method1()获取lock1和lock2,而method2()只接受lock2,它不会导致死锁。