Guru saya di kelas Java tingkat atas tentang threading mengatakan sesuatu yang saya tidak yakin.
Dia menyatakan bahwa kode berikut belum tentu memperbarui readyvariabel. 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 readydiperbarui di utas utama, tetapi BUKAN di ReaderThread, sehingga ReaderThreadakan berulang tanpa batas.
Dia juga mengklaim program itu mungkin untuk dicetak 0atau 42. Saya mengerti bagaimana 42bisa dicetak, tapi tidak 0. Dia menyebutkan ini akan menjadi kasus ketika numbervariabel 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 readyvolatile 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;
}
}
