В «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;
}
}