Mein Lehrer in einer Java-Klasse der Oberstufe zum Thema Threading sagte etwas, dessen ich mir nicht sicher war.
Er erklärte, dass der folgende Code die ready
Variable nicht unbedingt aktualisieren würde . Ihm zufolge teilen sich die beiden Threads nicht unbedingt die statische Variable, insbesondere in dem Fall, dass jeder Thread (Hauptthread versus ReaderThread
) auf einem eigenen Prozessor ausgeführt wird und daher nicht dieselben Register / Cache / etc und eine CPU gemeinsam nutzt wird den anderen nicht aktualisieren.
Im Wesentlichen sagte er, es sei möglich, dass ready
im Haupt-Thread aktualisiert wird, aber NICHT im ReaderThread
, so dass sich ReaderThread
eine Endlosschleife ergibt.
Er behauptete auch, es sei möglich, dass das Programm drucke 0
oder 42
. Ich verstehe, wie 42
gedruckt werden könnte, aber nicht 0
. Er erwähnte, dass dies der Fall sein würde, wenn die number
Variable auf den Standardwert gesetzt wird.
Ich dachte, es ist vielleicht nicht garantiert, dass die statische Variable zwischen den Threads aktualisiert wird, aber das kommt mir für Java sehr seltsam vor. Behebt das ready
Volatilisieren dieses Problem?
Er zeigte diesen Code:
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;
}
}