看《并发编程实战》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对象的锁吗?
黄舟2017-04-17 16:16:44
更新:
原文の例と説明を注意深く読んだところ、著者は間違いを犯したように感じました。まず第一に、同期メソッドは this
をロックします。これは確かです。
そして、オブジェクトには this
が 1 つだけ、つまりそれ自体が含まれます。したがって、サブクラスの doSomething()
メソッド内の this
と親クラスは、両方ともサブクラス LoggingWidget
のオブジェクトです。したがって、どちらのメソッドも、本書で説明されているように LoggingWidget对象
ではなく Widget对象
をロックします。
この記述は明らかに間違っていますが、子类对象同时也是一个父类对象
があるから間違っているとは言えず、LoggingWidget对象
をWidget对象
と言うのは文法的に間違いではありません。ただし、ここで同期方法について話す場合、この記述は明らかに間違っています (少なくとも間違っているはずはありません)。これは著者の過失または印刷ミスによるものであるはずです。