2016-06-01 6 views
2

У меня есть программа, которая выглядит в сущности, как этогоВызова внешнего класса синхронизирован метод из внутреннего класса

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

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

замыкающемся делает Inner.run() приобретают, когда он звонит doSomething()? Он идентичен synchronized(Inner.this) или synchronized(Outer.this)?

Большое спасибо.

+2

'synchronized' не имеет ничего общего с сайтом. – SLaks

+0

'Inner.this' и' Outer.this' не являются действительными фрагментами кода на Java. – SamTebbs33

+2

@ SamTebbs33 Они есть. Они позволяют вам учитывать особенности экземпляров для внутренних классов. –

ответ

3

Приемник для вызова doSomething() в пределах run() - Outer.this. Таким образом, synchronized заблокирует монитор на объекте, на который ссылается это выражение.

На computing the target reference in a method invocation expression, то ПСБ говорит

В противном случае, пусть T быть типом вшита декларацией которого метод является членом, и пусть n целое число таких, что T является n'th лексический ограждающим типа объявление класса, объявление которого немедленно содержит вызов метода. Целевой ссылкой является n'th лексически охватывающий экземпляр этого.

T здесь Outer, так как это класс, который объявляет его. n - 1, так как Outer - это объявление о закрытом типе Inner. Поэтому целевой ссылкой является 1-й лексически охватывающий экземпляр this, т.е. Outer.this.

Concerning synchronized methods, то ПСБ говорит

Для метода экземпляра, монитор, связанный с this (объект , для которого метод был вызван) используется.