2010-05-15 101 views
4
public class A { } 
public class B:A { } 

void foo() 
{ 
    A a = new B(); 
    B b = a as B; 
} 

對於給定的實例設置,將lock(a)等效於lock(b)鎖定()是否安全?

我的意思是,鎖定是互斥的嗎?如果我在一個線程中使用lock(a),而在另一個線程中使用lock(b),我是否可以獲得對之前創建的B單一實例的互斥訪問?

+0

你是什麼意思等同? – 2010-05-15 03:34:23

回答

12

lock(a){}相當於lock(b){}

The lock() documentation指出鎖語句通過獲取給定引用類型對象的互斥鎖來將語句塊標記爲臨界區。

ab都是相同的對象,所以是的,它們是等效的。其實ab都是對同一個對象的引用。

引用類型之間的轉換操作不會更改基礎對象的運行時類型;它只會改變用作該對象引用的值的類型。 Source

快速測試程序表明,它確實表現它記錄的方式:

namespace ConsoleApplication2 
{ 
    public class A { } 
    public class B : A { } 

    class Program 
    { 
     static A a = new B(); 

     static void MyThread() 
     { 
      B b = a as B; 
      lock (b) 
      { 
       Console.WriteLine("b lock acquired"); 
       Console.WriteLine("releasing b lock"); 
      } 

     } 


     static void Main(string[] args) 
     { 
      System.Threading.Thread t = new System.Threading.Thread(MyThread); 

      lock(a) 
      { 
       Console.WriteLine("a lock acquired");    
       t.Start(); 
       System.Threading.Thread.Sleep(10000); 
       Console.WriteLine("Releasing a lock"); 
      } 
     } 
    } 
} 

鎖定收購
... 10秒後
釋放了鎖定
b鎖
發佈b鎖