看《并发编程实战》P21页里说以下代码:
由于Widget和LoggingWidget中执doSomething方法都是synchronized方法,因此每个doSomething方法在执行前都会获取Widget的锁。
public class Widget {
public synchronized void doSomething() {
// do somethig here...
}
}
public class LoggingWidget extends Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling doSomething");
super.doSomething();
}
}
为什么LoggingWidget上的doSomething方法会获取Widget的锁?不是应该获取的LoggingWidget对象的锁吗?
更新:
原文の例と説明を注意深く読んだところ、著者は間違いを犯したように感じました。まず第一に、同期メソッドは
this
をロックします。これは確かです。そして、オブジェクトには
this
が 1 つだけ、つまりそれ自体が含まれます。したがって、サブクラスのdoSomething()
メソッド内のthis
と親クラスは、両方ともサブクラスLoggingWidget
のオブジェクトです。したがって、どちらのメソッドも、本書で説明されているようにLoggingWidget对象
ではなくWidget对象
をロックします。この記述は明らかに間違っていますが、
子类对象同时也是一个父类对象
があるから間違っているとは言えず、LoggingWidget对象
をWidget对象
と言うのは文法的に間違いではありません。ただし、ここで同期方法について話す場合、この記述は明らかに間違っています (少なくとも間違っているはずはありません)。これは著者の過失または印刷ミスによるものであるはずです。