加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 内在/监视器锁定和继承

发布时间:2020-12-15 04:21:53 所属栏目:Java 来源:网络整理
导读:背景: 我正在阅读Java Concurrency in Practice,清单2.7包含以下代码.该示例指出此代码仅起作用,因为监视器锁是可重入的. 我原本以为当你调用super.doSomething()时它会获得对基类对象的锁定而不是派生类对象.这意味着这种情况不需要重新进入.说到这一点,我
背景:

我正在阅读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();
    }
}

解决方法

I would have originally thought that when you called super.doSomething() then it would have acquired a lock on the base class object and not the derived class object.

只有一个对象 – 如果你创建了一个LoggingWidget实例,那么只创建了一个对象,其中包含LoggingWidget中的所有字段以及Widget中的所有字段.它不像是创建了一个LoggingWidget实例,它引用了Widget的一个实例.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读