2009-04-13 98 views
4

下面的程序打印:爲什麼我無法獲得排他鎖?

Entered 3 
Entered 4 
Wait for Exited messages 
Exited 3 
Exited 4 

含義,它不能獲得對資源的獨佔鎖。爲什麼?

public class Worker 
    { 
     public void DoIt(object resource) 
     { 
      Monitor.Enter(resource); 
      Console.WriteLine("Entered " + Thread.CurrentThread.ManagedThreadId); 
      Thread.Sleep(3000); 
      Monitor.Exit(resource); 
      Console.WriteLine("Exited " + Thread.CurrentThread.ManagedThreadId); 
     } 
    } 

    class Program 
    { 
     struct Resource 
     { 
      public int A; 
      public int B; 
     } 

     static void Main(string[] args) 
     { 
      Resource resource; 
      resource.A = 0; 
      resource.B = 1; 

      var a = new Worker(); 
      var b = new Worker(); 

      var t1 = new Thread(() => a.DoIt(resource)); 
      var t2 = new Thread(() => b.DoIt(resource)); 

      t1.Start(); 
      t2.Start(); 

      Console.WriteLine("Wait for Exited messages"); 
      Console.ReadLine(); 
     } 
    } 

回答

10

您的Resource是一個結構。它被傳遞到DoIt,因此每次撥打DoIt都會鎖定不同的對象。將Resource更改爲類。

相關問題