Giáo viên của tôi trong một lớp Java cấp cao hơn về phân luồng đã nói điều gì đó mà tôi không chắc chắn.
Ông nói rằng đoạn mã sau đây không nhất thiết phải cập nhật ready
biến. Theo ông, hai luồng không nhất thiết phải chia sẻ biến tĩnh, cụ thể là trong trường hợp mỗi luồng (luồng chính so với ReaderThread
) đang chạy trên bộ xử lý của chính nó và do đó không chia sẻ cùng một thanh ghi / bộ nhớ cache / v.v. và một CPU. sẽ không cập nhật cái khác.
Về cơ bản, anh ấy nói rằng có thể ready
được cập nhật trong chuỗi chính, nhưng KHÔNG phải trong ReaderThread
, vì vậy điều đó ReaderThread
sẽ lặp lại vô hạn.
Ông cũng tuyên bố rằng chương trình có thể in 0
hoặc 42
. Tôi hiểu làm thế nào 42
có thể được in, nhưng không 0
. Ông đã đề cập đây sẽ là trường hợp khi number
biến được đặt thành giá trị mặc định.
Tôi nghĩ rằng có lẽ nó không được đảm bảo rằng biến tĩnh được cập nhật giữa các luồng, nhưng điều này khiến tôi cảm thấy rất kỳ lạ đối với Java. Làm ready
biến động có khắc phục được vấn đề này không?
Anh ấy đã hiển thị mã này:
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;
}
}