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

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

주어진 인스턴스 설치의 경우, 은 lock(b)과 동일합니까?lock() 타입 캐스트가 안전한가요?

내 말은 잠금은 상호 배타적입니까? 하나의 스레드에서 lock(a)을, 다른 스레드에서 lock(b)을 얻은 경우 이전에 생성 한 B의 단일 인스턴스에 대해 상호 배타적 인 액세스 권한을 얻게됩니까?

+0

정확히 동일한 의미입니까? –

답변

12

lock(a){}lock(b){}과 같습니다.

The lock() documentation은 lock 문이 특정 참조 유형의 개체에 대한 상호 배제 잠금을 가져 와서 명령문 블록을 중요한 섹션으로 표시한다고 명시합니다.

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 잠금 해제
합격 :

빠른 테스트 프로그램

는 실제로 그것을 설명하는 방식으로 작동 않는 것을 보여준다
잠금 해제

관련 문제