ครูของฉันในคลาส Java ระดับสูงเกี่ยวกับเธรดพูดบางอย่างที่ฉันไม่แน่ใจ
เขาระบุว่าโค้ดต่อไปนี้ไม่จำเป็นต้องอัพเดตready
ตัวแปร ตามที่เขาพูดทั้งสองเธรดไม่จำเป็นต้องแชร์ตัวแปรคงที่โดยเฉพาะในกรณีที่แต่ละเธรด (เธรดหลักเทียบกับReaderThread
) กำลังทำงานบนโปรเซสเซอร์ของตัวเองดังนั้นจึงไม่แชร์รีจิสเตอร์ / แคช / ฯลฯ เดียวกันและซีพียูตัวเดียว จะไม่อัปเดตอื่น ๆ
โดยพื้นฐานแล้วเขากล่าวว่าเป็นไปได้ที่ready
จะมีการอัปเดตในเธรดหลัก แต่ไม่ใช่ในเธรดReaderThread
ดังนั้นสิ่งนั้นReaderThread
จะวนซ้ำไปเรื่อย ๆ
นอกจากนี้เขายังอ้างว่าเป็นไปได้ที่โปรแกรมจะพิมพ์0
หรือ42
. ผมเข้าใจว่า42
อาจจะมีการพิมพ์ 0
แต่ไม่ เขากล่าวถึงกรณีนี้เมื่อnumber
ตัวแปรถูกตั้งค่าเป็นค่าเริ่มต้น
ฉันคิดว่าบางทีไม่สามารถรับประกันได้ว่าตัวแปรคงที่ถูกอัพเดตระหว่างเธรด แต่สิ่งนี้ทำให้ฉันแปลกมากสำหรับ Java การready
ระเหยสามารถแก้ไขปัญหานี้ได้หรือไม่?
เขาแสดงรหัสนี้:
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;
}
}