内在/监视器锁定和继承

时间:2014-08-15 13:14:22

标签: java multithreading inheritance locking monitor

背景

我正在阅读Java Concurrency in Practice,清单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();
    }
}

1 个答案:

答案 0 :(得分:7)

  

我原本以为当你调用super.doSomething()时它会获得对基类对象的锁定,而不是派生类对象。

只有一个对象 - 如果您创建LoggingWidget的实例,则只创建一个对象,其中包含{{1}的所有字段}和来自LoggingWidget的所有字段。它不像创建一个引用Widget实例的LoggingWidget实例。

只有一个对象,因此只有一个锁,无论你在哪里同步。