0

oracle.com の例がありますが、理解できません。説明してください。1 つのスレッドが bow を実行し、次に bowback を実行しますが、何も印刷されないのはなぜですか?

public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s"
                + "  has bowed to me!%n", 
                this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                + " has bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new Runnable() {
            public void run() { alphonse.bow(gaston); }
        }).start();
        new Thread(new Runnable() {
            public void run() { gaston.bow(alphonse); }
        }).start();
    }
}
4

2 に答える 2

3

タイミングによります。各スレッドは弓に入り、そのオブジェクトをそのスレッドにロックします。次に、その同期メソッド内で、他のオブジェクトで bowBack を呼び出そうとします。しかし、そのメソッドは同期されており、オブジェクトは他のスレッドにロックされています。そのため、両方のスレッドが他のオブジェクト モニターが解放されるのを待っていますが、解放されることはありません。したがって、デッドロック。

繰り返しますが、これは本当にタイミングに依存します。2 番目のスレッドが開始する前に最初のスレッドが終了した場合、正常に動作します。

于 2013-09-04T20:57:29.533 に答える