Мій викладач у класі 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;
}
}
