Java 可重入锁问题
ringa_lee
ringa_lee 2017-04-17 16:14:44
0
1
655

看《并发编程实战》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对象的锁吗?

ringa_lee
ringa_lee

ringa_lee

全員に返信(1)
黄舟

更新:

原文の例と説明を注意深く読んだところ、著者は間違いを犯したように感じました。まず第一に、同期メソッドは this をロックします。これは確かです。

そして、オブジェクトには this が 1 つだけ、つまりそれ自体が含まれます。したがって、サブクラスの doSomething() メソッド内の this と親クラスは、両方ともサブクラス LoggingWidget のオブジェクトです。したがって、どちらのメソッドも、本書で説明されているように LoggingWidget对象 ではなく Widget对象 をロックします。

この記述は明らかに間違っていますが、子类对象同时也是一个父类对象があるから間違っているとは言えず、LoggingWidget对象Widget对象と言うのは文法的に間違いではありません。ただし、ここで同期方法について話す場合、この記述は明らかに間違っています (少なくとも間違っているはずはありません)。これは著者の過失または印刷ミスによるものであるはずです。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート