2016-06-01 3 views
2

에서 원 공급기 방법 나는 doSomething()를 호출 할 때 Inner.run() 취득하지 잠이호출 외부 클래스의 내부 클래스

class Outer { 
    class Inner implements Runnable { 
     public void run() { 
      doSomething(); 
     } 
    } 

    public synchronized void doSomething() { 
     //... 
    } 
} 

처럼 본질적으로 보이는 프로그램이? synchronized(Inner.this) 또는 synchronized(Outer.this)과 동일합니까?

미리 감사드립니다.

+2

'synchronized'는 callsite와는 아무런 관련이 없습니다. – SLaks

+0

'Inner.this'와'Outer.this'는 Java에서 유효한 코드가 아닙니다. – SamTebbs33

+2

@ SamTebbs33 그들은 있습니다. 이 클래스를 사용하면 내부 클래스에 대해 인스턴스를 묶는 것에 대해 구체적으로 지정할 수 있습니다. –

답변

3

run() 내의 doSomething() 호출에 대한 수신자는 Outer.this입니다. 따라서 synchronized은 해당 표현식이 참조하는 객체에서 모니터를 잠글 것입니다. computing the target reference in a method invocation expression

는 JLS는

그렇지 않으면, T는 방법은 구성원 인 둘러싸는 형태 선언, 그리고 nTn'th 어휘 둘러싸는 형태가되도록 정수하자하자 말한다 선언이 메소드 호출을 즉시 포함하는 클래스의 선언. 대상 참조는 n'th 어휘 적으로이 인스턴스를 포함합니다. 그게 선언하는 클래스가 이후

T 여기, Outer입니다. n이 1 인 경우 Outer은 즉시 둘러싸는 유형 선언 인 Inner입니다. 따라서 목표 참조는 어휘를 둘러싸는 1 분의 1 this의 인스턴스입니다. Outer.this.

Concerning synchronized methods

상기 JLS는 인스턴스 메소드

사용되고 this (메소드가 호출되는 객체 )와 연결된 모니터를 말한다.

관련 문제