Я сейчас читаю Java Concurrency in Practice и есть что-то, что я не могу понять.Значение visibility
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;
}
}
и автор говорит
NoVisibility мог зациклится, так как стоимость готового может никогда не стать видна читателю нить.
И нет никаких объяснений или, возможно, это где-то позже, но пока я действительно смущен. Я был бы очень признателен за любые объяснения.
Да, я знаю это, но почему? Почему настройка готовности к истине не отражается в другом потоке? – Stuart
Поскольку значения кэшируются. Очень дорого всегда извлекать значение из основной памяти, поэтому вам нужно явно «поделиться» значением, будь то с помощью энергозависимого поля, синхронизированного блока или другого механизма. – Kayaman
Правильно, вы можете найти больше на этом на http://tutorials.jenkov.com/java-concurrency/volatile.html. – Eranda