Блокировка в этом случае установлена на this
, поэтому существует только одна блокировка, которая является экземпляром. Если существует более одного экземпляра, каждый из них имеет совершенно отдельную блокировку независимо от того, Widget
или LoggingWidget
.
Позвольте мне сказать по-другому. Ваш код семантически эквивалентен:
public class Widget {
public void doSomething() {
synchronized (this) {
// do stuff
}
}
}
public class LoggingWidget extends Widget {
public void doSomething() {
synchronized (this) {
System.out.println(toString() + ": calling doSomething");
super.doSomething();
}
}
}
Вызывается только один из этих методов, поэтому есть только одна блокировка.