2017-04-16 4 views
0

이 질문은 Java Concurrency in Practice의 예에서 나왔습니다. 이 책의 2 장에서 우리는 이와 같은 예를 얻었고, 나는 그것을 완전히 복사하지는 않습니다. 다음 코드 블록을 가지고 있다고합시다.동기화 된 메서드 override- 스레드가 개체를 잠급니다.

class A{ 
synchronized void method1(){ 
    do some stuff.. 
    } 
} 
class B extends A{ 
    synchronized void method1(){ 
    super.method1(); 
    } 
} 

이제 우리는 B 클래스의 객체를 만들고 다음을 수행합니다. public static void main.

B b=new B() 
Thread t1=new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      b.method1(); 
     } 
    }); 
Thread t2=new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      b.method1(); 
     } 
    }); 

그리고 나서 t1 및 t2 스레드를 시작하십시오.

여기에 내 질문에 있습니다

내가 여기에 방법을 동기화 한 것처럼
  1. 하는 스레드가 잠금 얻는다 반대? 나는 코드

    super.method1()를 B 개체의 잠금을 획득 만 B 객체와 B의 "방법 항목"나는 스레드 생각할 수있는 위해를 작성하지만 실행 다음과 같은 상태입니다

그리고 제어 이후 최고에 도달 객체가 잠금을 획득하는 클래스의 method1?

  1. 이 동작이 Reentrancy에 어떻게 연결되어 있습니까?
+0

실제로 컴파일하는 게시 코드는 어떻습니까? 쓰레드가'method1'을 호출하거나 실제로'B'의 인스턴스를 사용할 수있는 것을 보여주는 것은 없습니다. 이것은 차례로 귀하의 질문을 모호하게하여 귀하가 묻고 답할 수없는 것을 알 수 없도록합니다. –

+0

사과, 수정. –

+0

세미콜론을 제외하고. 게시 한 코드를 실제로 컴파일하고 실행합니까? –

답변

1

B의 인스턴스 만 있으므로 모니터를 가져올 대상입니다.

super.method1() 호출도 모니터를 획득합니다 (re-entrantly). 객체는 여전히 B이므로 모니터가 여전히 this (즉, 동일한 정확한 인스턴스)에서 획득 되었기 때문에 메소드가 수퍼 클래스에 정의되어 있다는 점에 차이가 없습니다.

+0

그러나 게시 된 코드는 두 스레드가 모두 'B'인스턴스에 액세스한다는 표시를 표시하지 않습니다. –

+1

나는 게시 된 코드를 무시하고 정보를 외삽하는 법을 배웠다. – Kayaman

+0

나는 그 반대를 알게되었다. 나는 내 경력에서 내가 "외삽 법"(추측)을 잘못했다고 생각한 횟수를 셀 수 없다. 명확하고 모호하지 않은 요구 사항을 제공하고 요구하는 것은 소프트웨어 엔지니어링의 일부입니다. –