3

次のコードは、plain() メソッドを呼び出す前に同期された sync() メソッドでブロックします。なぜそうなのか、固有のロック ブロック呼び出しは同期されたメソッドのみであってはなりません。たとえば、plain() も同期されていれば、この動作は問題ありませんでした。

Java が使用するモニターの概念は、同期されたメソッド/ブロックにのみ適用されるため、定義上、同期されていないコードの実行に影響を与えるべきではありません。これは常に当てはまりますか、それともこの動作は JVM 実装固有のものですか。

public class Main {

    public static void main(final String[] args) {
        final Main main = new Main();
        new Thread(new Runnable() {
            @Override
            public void run() {
                main.sync();
            }
        }).run();
        main.plain();
    }

    public synchronized void sync() {
        try {
            System.out.println("sleeping...");
            Thread.sleep(2000);
            System.out.println("out...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void plain() {
        System.out.println("plain...");
    }
}

出力:

sleeping...
out...
plain...
4

1 に答える 1

8

新しいスレッドでstart()はなく呼び出す必要があります。run()呼び出しは、新しいスレッドを開始して実行するのではなく、現在のスレッドで実行可能なメソッドを実行しますrun()run

于 2012-09-24T10:13:32.163 に答える