看《并发编程实战》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
하나만 가질 것입니다. 따라서 하위 클래스의doSomething()
메서드에 있는this
과 상위 클래스는 모두 하위 클래스LoggingWidget
의 개체입니다. 따라서 두 방법 모두 책에서 언급한LoggingWidget对象
이 아닌Widget对象
을 잠급니다.이 설명은 분명히 틀린 설명이지만
子类对象同时也是一个父类对象
때문에 틀렸다고 할 수 없으므로LoggingWidget对象
를Widget对象
로 표현해도 문법적 오류는 없습니다. 그러나 여기서 동기화 방법을 논할 때 이 설명은 분명히 잘못된 것입니다(적어도 그렇지는 않습니다). 이는 작성자의 부주의나 인쇄상의 실수로 인한 것입니다.