Видимость значения

Сейчас я читаю Java Concurrency in Practice и кое-что не могу понять.

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 может зацикливаться бесконечно, потому что значение ready может никогда не стать видимым для потока чтения.

И объяснения нет или может оно где-то потом, а пока я совсем запутался. Я был бы очень признателен за любое объяснение.


person user123454321    schedule 29.11.2015    source источник


Ответы (1)


Это значит, что

while (!ready)
    Thread.yield();

будет работать вечно, потому что установка значения true в основном методе не будет отражаться в потоке.

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

Вместо этого вы можете использовать термин volatile, который будет обновлять значение при изменении переменной.

person Eranda    schedule 29.11.2015
comment
Да я это знаю, но зачем? Почему установка значения true не будет отражена в другом потоке? - person user123454321; 29.11.2015
comment
Потому что значения кэшируются. Всегда извлекать значение из основной памяти очень дорого, поэтому вам необходимо явно делиться значением, используя изменчивое поле, синхронизированный блок или другой механизм. - person Kayaman; 29.11.2015
comment
Правильно, вы можете найти больше об этом на tutorials.jenkov.com/java-concurrency/volatile. .html. - person Eranda; 29.11.2015