2012-04-02 11 views
15

Tôi nghĩ rằng tôi hiểu mối quan hệ đã xảy ra trước đó đối với các biến đơn lẻ. Nếu tôi viết một trường dễ bay hơi, tất cả các lần đọc tiếp theo của trường này sẽ chứa giá trị mới này. Viết volatile vượt qua hàng rào bộ nhớ và chuyển giá trị mới sang bộ nhớ chính.Mô hình bộ nhớ Java - chính xác những gì được xả vào bộ nhớ khi vượt qua rào cản bộ nhớ?

Tôi vẫn chưa rõ về những gì xảy ra trong tất cả các trường hợp khác - ví dụ: Thread.start(), synchronized hoặc khóa mới trong java.util.concurrent. Điều đó có nghĩa là họ cũng vượt qua rào cản bộ nhớ? Dữ liệu nào được xóa từ bộ đệm cục bộ sang bộ nhớ chính? Nói cách khác, phạm vi của việc vượt qua là gì?

Có phải mọi thứ luôn luôn bị xóa? Bây giờ trở lại volatile, nó có tuôn ra nhiều hơn chỉ một trường volatile duy nhất không?

Trả lời

12

Khi hàng rào bộ nhớ bị vượt qua JVM đồng bộ hóa tất cả cục bộ (trong ngữ cảnh của chuỗi hiện tại) các biến được lưu trong bộ nhớ cache với bộ nhớ chính. Bên cạnh đó, nó loại bỏ bất kỳ dữ liệu lưu trữ cục bộ được đánh dấu là bẩn trong bộ nhớ chính.

Về ổn định - có, nó cũng đồng bộ hóa tất cả mọi thứ tại địa phương lưu trữ với bộ nhớ chính, không chỉ lĩnh vực không ổn định duy nhất (từ 1,5)

http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

+0

Tốt điểm. Tôi đã thay đổi ngôn ngữ. –

+0

Ngoài ra, bạn nên đề cập rằng nó loại bỏ bất kỳ lưu trữ được lưu trữ nào bị bẩn trong bộ nhớ trung tâm. Xin lỗi để được picky nit. Đây là một câu hỏi hay. – Gray

+0

@Gray bạn có thể vui lòng xây dựng (hoặc cung cấp liên kết) trên bộ nhớ đệm ẩn trong bộ nhớ chính không? Nó là gì? –