İş parçacığı üzerine bir üst düzey Java sınıfındaki öğretmenim emin olmadığım bir şey söyledi.
Aşağıdaki kodun ready
değişkeni mutlaka güncellemeyeceğini belirtti . Ona göre, özellikle her iş parçacığının (ana iş parçacığına karşı ReaderThread
) kendi işlemcisi üzerinde çalıştığı ve bu nedenle aynı yazmaçları / önbelleği / vb. Ve bir CPU'yu paylaşmadığı durumda, iki iş parçacığı statik değişkeni paylaşmayabilir. diğerini güncellemeyecek.
Esasen, ready
ana iş parçacığında güncellenmesinin mümkün olduğunu , ancak içinde DEĞİL ReaderThread
, böylece ReaderThread
sonsuz döngüde kalacağını söyledi .
O da programın yazdırmak mümkün olduğunu iddia etti 0
ya 42
. Nasıl 42
basılabileceğini anlıyorum ama değil 0
. number
Değişken varsayılan değere ayarlandığında bunun böyle olacağından bahsetti .
Statik değişkenin iş parçacıkları arasında güncellenmesinin garanti edilmeyeceğini düşündüm, ancak bu Java için bana çok garip geliyor. ready
Uçucu hale getirmek bu sorunu çözüyor mu ?
Şu kodu gösterdi:
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;
}
}