Meu professor em uma classe de Java de nível superior sobre threading disse algo que eu não tinha certeza.
Ele afirmou que o código a seguir não atualizaria necessariamente a ready
variável. Segundo ele, os dois threads não necessariamente compartilham a variável estática, especificamente no caso em que cada thread (thread principal versus ReaderThread
) está rodando em seu próprio processador e, portanto, não compartilham os mesmos registradores / cache / etc e uma CPU não atualizará o outro.
Essencialmente, ele disse que é possível que ready
seja atualizado no thread principal, mas NÃO no ReaderThread
, de modo que ReaderThread
fará um loop infinito.
Ele também afirmou que era possível para o programa imprimir 0
ou 42
. Eu entendo como 42
poderia ser impresso, mas não 0
. Ele mencionou que esse seria o caso quando a number
variável fosse definida com o valor padrão.
Pensei que talvez não fosse garantido que a variável estática seja atualizada entre os threads, mas isso me parece muito estranho para Java. Tornar ready
volátil corrige este problema?
Ele mostrou este código:
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;
}
}