2011-02-02 63 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)。