1

私は「Java Concurrency in Practice」という本を読んで、Java の同時実行がどのように機能するかをよりよく理解しています。第 3 章セクション 3.1: 可視性 本書が可視性の問題がどのように発生するかを示そうとする例があります。以下にコード例を示します (本のリスト 3.1)。


public class NoVisibility {
    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread {
        public void run() {
            while (!ready)
                Thread.yield();
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        new ReaderThread().start();
        number = 42;
        ready = true;
    }
}

この本によると、ready の値がリーダー スレッドに表示されることは決してないため、NoVisibility は永久にループする可能性があります。そんなことがあるものか。いずれにせよ、ready はある時点で true になるというのが私の一般的な理解です。しかし、なぜこれが起こらず、ループが永遠に続くのか理解できません。誰かがこれをよりよく理解するのを手伝ってくれますか?

4

1 に答える 1

6

準備完了は揮発性としてマークされておらず、値はwhileループ内で変更されないため、whileループの開始時にキャッシュされる可能性があるためです。これは、ジッターがコードを最適化する方法の1つです。

したがって、スレッドがready = trueの前に開始し、ready = falseを読み取ると、そのスレッドがローカルにキャッシュされ、二度と読み取られなくなる可能性があります。

volatileキーワードを確認してください。

ソース

于 2013-03-10T13:07:41.260 に答える