Синхронизация модели памяти Java: как вызвать ошибку видимости данных?

В «Java Concurrency in Practice» приводится следующий пример небезопасного класса, который по своей природе модели памяти Java может в конечном итоге работать вечно или напечатать 0.

Проблема, которую этот класс пытается продемонстрировать, заключается в том, что переменные здесь не являются «общими» между потоками. Таким образом, значение в потоке может отличаться от другого потока, поскольку они не являются изменчивыми или синхронизированными. Также из-за переупорядочения операторов, разрешенного JVM, ready = true может быть установлено до number = 42.

На мой взгляд, этот класс всегда отлично работает с JVM 1.6. Есть идеи, как заставить этот класс выполнять некорректное поведение (т.е. печатать 0 или работать вечно)?

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;
    }
}
9
задан DD. 23 June 2012 в 07:06
поделиться