Guru saya di kelas Java tingkat atas tentang threading mengatakan sesuatu yang saya tidak yakin.
Dia menyatakan bahwa kode berikut belum tentu memperbarui ready
variabel. Menurutnya, kedua utas tidak harus berbagi variabel statis, khususnya dalam kasus ketika setiap utas (utas utama versus ReaderThread
) berjalan pada prosesornya sendiri dan oleh karena itu tidak berbagi register / cache / dll yang sama dan satu CPU tidak akan memperbarui yang lain.
Pada dasarnya, dia mengatakan itu mungkin yang ready
diperbarui di utas utama, tetapi BUKAN di ReaderThread
, sehingga ReaderThread
akan berulang tanpa batas.
Dia juga mengklaim program itu mungkin untuk dicetak 0
atau 42
. Saya mengerti bagaimana 42
bisa dicetak, tapi tidak 0
. Dia menyebutkan ini akan menjadi kasus ketika number
variabel disetel ke nilai default.
Saya pikir mungkin tidak ada jaminan bahwa variabel statis diperbarui di antara utas, tetapi ini menurut saya sangat aneh untuk Java. Apakah membuat ready
volatile memperbaiki masalah ini?
Dia menunjukkan kode ini:
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;
}
}