2011-02-02 95 views
-1
class Program 
    { 
     static void Main(string[] args) 
     { 
      Thread thread1 = new Thread((ThreadStart)DLockSample.FunctionA); 
      Thread therad2 = new Thread((ThreadStart)DLockSample.FunctionB); 
      thread1.Start(); 
      therad2.Start(); 
     } 
    } 

    public class DLockSample 
    { 
static object object1 = new object(); 
     static object object2 = new object(); 

     public static void FunctionA() 
     { 
      lock (object1) 
      { 
       Thread.Sleep(1000); 
       lock (object2) 
       { 
        Thread.Sleep(1000); 
        Console.WriteLine("heart beat - object2"); 
       } 
      } 
     } 
     public static void FunctionB() 
     { 
      lock (object2) 
      { 

       lock (object1) 
       { 
        Thread.Sleep(1000); 
        Console.WriteLine("heart beat - object1"); 
       } 
      } 
     } } 
+0

這顯然是故意的。這不是很有趣,只需交換FunctionB中的鎖。如果您想要教育答案,請務必使用[作業]標籤。 – 2011-02-02 13:06:54

回答

1

總是在所有線程中以相同的順序輸入鎖。也參見hierarchy of critical sections即, FunctionB需要是:

public static void FunctionB() 
     { 
      lock (object1) 
      { 

       lock (object2) 
    ... 
+0

是的,現貨... – 2011-02-02 12:22:31

+0

我同意。但是代碼塊有意模擬場景,我們應該能夠提出一些合適的解決方案。 – sawer 2011-02-02 12:23:47

1

這是一個很好的解決問題的方法。只是一些使用技巧:

  • 總是以相同的順序
  • 如果它是不可能以相同的順序鎖定,使用對象的字段保存順序(例如,如果A.Id> B.上的對象鎖定Id然後在B之前始終鎖定A)。