背景:
我正在阅读《Java并发编程实践》,其中清单2.7有以下代码。该示例说明此代码之所以有效,是因为监视器锁是可重入的。
我最初可能会认为调用super.doSomething()
时将获取基类对象而不是派生类对象上的锁。这意味着这种情况不需要重入性。尽管如此,我也明白基类和派生类方法都可以改变基类字段,所以它们使用的锁必须是公共的(这意味着我显然是错误的)。
问题:
在继承层次结构中,每个对象是否有一个“内部”锁,或者仅与继承层次结构中最终派生对象(或最少派生对象)相关联一个“内部”锁?
public class Widget {
public synchronized void doSomething() {
...
}
}
public class LoggingWidget extends Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling doSomething");
super.doSomething();
}
}