2010-05-15 74 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锁