Tôi đang cố gắng tìm hiểu xem mã bên dưới có gặp phải bất kỳ vấn đề tương tranh tiềm ẩn nào không. Cụ thể, vấn đề về khả năng hiển thị liên quan đến biến dễ bay hơi. dễ bay hơi được định nghĩa là: Giá trị của biến này sẽ không bao giờ được lưu trữ thread-địa phương: tất cả đọc và viết sẽ đi thẳng vào "bộ nhớ chính"Đồng thời, hiển thị đối tượng
public static void main(String [] args)
{
Test test = new Test();
// This will always single threaded
ExecutorService ex = Executors.newSingleThreadExecutor();
for (int i=0; i<10; ++i)
ex.execute(test);
}
private static class Test implements Runnable {
// non volatile variable in question
private int state = 0;
@Override
public void run() {
// will we always see updated state value? Will updating state value
// guarantee future run's see the value?
if (this.state != -1)
this.state++;
}
}
Đối với trên đơn thi hành di chúc ren:
Có thể thực hiện test.state không dễ bay hơi không? Nói cách khác, sẽ mỗi lần tiếp theo Test.run() (sẽ xuất hiện tuần tự và không đồng thời bởi vì một người thi hành một lần nữa là luồng đơn), luôn luôn xem giá trị được kiểm tra đã cập nhật? Nếu không, không thoát khỏi Test.run() đảm bảo mọi thay đổi được tạo cục bộ sẽ được ghi lại vào bộ nhớ chính? Nếu không thì những thay đổi được thực hiện tại địa phương có được ghi lại cho bộ nhớ chính nếu không khi thoát khỏi chủ đề?
bạn đã nhận được ở đâu định nghĩa đó. Âm thanh như định nghĩa JMM trước 1.5 (không thể thực hiện được). –
http://www.javamex.com/tutorials/synchronization_volatile.shtml – Integer
Điều quan trọng là phải nhận ra rằng khi chuỗi hoàn thành 'Test.run()', luồng không kết thúc và bất kỳ đảm bảo nào về các giá trị được viết bởi thread được flushed đến bộ nhớ chính trước khi nó chấm dứt không áp dụng.Chủ đề phương thức 'run()' gọi 'Test.run()' của bạn chỉ đơn giản là một vòng lặp, cho đến khi nó nhận được một nhiệm vụ mới để thực thi. Khi nhiệm vụ đó trở về từ * phương thức * run() 'của nó, luồng chỉ cho đến khi nhiệm vụ tiếp theo; nó không chấm dứt (và do đó, tuôn ra trạng thái của nó). – erickson