Giáo viên của tôi trong một lớp học cấp trên java về luồng nói điều gì đó mà tôi không chắc chắn.Biến tĩnh có được chia sẻ giữa các luồng không?
Ông tuyên bố rằng mã sau sẽ không nhất thiết phải cập nhật biến số ready
. Theo ông, hai chủ đề không nhất thiết phải chia sẻ biến tĩnh, đặc biệt trong trường hợp mỗi luồng (thread chính so với ReaderThread) đang chạy trên bộ xử lý riêng của nó và do đó không chia sẻ cùng một thanh ghi/bộ nhớ cache/v.v ... CPU sẽ không cập nhật khác.
Về cơ bản, ông cho biết có thể ready
được cập nhật trong chuỗi chính, nhưng KHÔNG ở trong ReaderThread, do đó ReaderThread sẽ lặp vô hạn. Ông cũng tuyên bố có thể chương trình in '0' hoặc '42'. Tôi hiểu làm thế nào '42' có thể được in, nhưng không phải là '0'. Ông đã đề cập này sẽ là trường hợp khi biến số number
được đặt thành giá trị mặc định.
Tôi nghĩ 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 đánh tôi rất kỳ quặc đối với Java. Việc thực hiện ready
có thể khắc phục được sự cố này không?
Ông đã cho thấy 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; } }
Khả năng hiển thị của các biến không phải cục bộ không phụ thuộc vào chúng là biến tĩnh, trường đối tượng hay phần tử mảng, tất cả đều có cùng cân nhắc. (Với vấn đề mà các phần tử mảng không thể biến động được.) –
hỏi giáo viên của bạn loại kiến trúc nào mà anh cho là có thể thấy '0'. Tuy nhiên, về lý thuyết anh ấy đúng. – bestsss
@bestsss Yêu cầu loại câu hỏi đó sẽ tiết lộ cho giáo viên rằng anh đã bỏ lỡ toàn bộ quan điểm của những gì anh đang nói. Vấn đề là các lập trình viên có thẩm quyền hiểu những gì được bảo đảm và những gì không và không dựa vào những thứ không được bảo đảm, ít nhất là không hiểu chính xác những gì không được bảo đảm và tại sao. –