Мій викладач у класі Java на верхньому рівні з потокових технологій сказав щось, у чому я не був впевнений.
Він заявив, що наступний код не обов'язково оновлює ready
змінну. За його словами, два потоки не обов'язково мають спільну статичну змінну, зокрема у випадку, коли кожен потік (основний потік проти ReaderThread
) працює на своєму власному процесорі і, отже, не використовує однакові регістри / кеш / тощо та один процесор не оновить іншу.
По суті, він сказав, що можливо, що ready
оновлено в основному потоці, але НЕ в ReaderThread
, тому це ReaderThread
буде нескінченно циклічно.
Він також стверджував, що програму можна надрукувати 0
або 42
. Я розумію, як 42
можна друкувати, але ні 0
. Він зазначив, що це буде у випадку, коли для number
змінної встановлено значення за замовчуванням.
Я думав, можливо, це не гарантовано, що статична змінна оновлюється між потоками, але це здається мені дуже дивним для Java. Чи ready
вирішення цієї проблеми виправляє непостійність
Він показав цей код:
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;
}
}