2010-04-22 42 views
8

Đánh dấu một biến là volatile trong Java đảm bảo rằng mọi chuỗi đều thấy giá trị được ghi lần cuối cùng thay vì một số giá trị cũ. Tôi đã tự hỏi làm thế nào điều này thực sự đạt được. Liệu JVM có phát ra các hướng dẫn đặc biệt để loại bỏ tiền mặt CPU hay gì đó không?Biến động thực sự hoạt động như thế nào?

+0

câu hỏi liên quan (người đầu tiên trong danh sách thực sự ..) http://stackoverflow.com/questions/1787450/how-do- i-hiểu-đọc-bộ nhớ-rào cản-và-bay hơi – BalusC

+0

Và một chủ đề tôi bắt đầu trên dễ bay hơi với rất nhiều "upvotes" và "yêu thích" liên quan đến out-of-order thực hiện: http://stackoverflow.com/questions/2441279/java-volatile-guarantee-and-out-of-order-execution – SyntaxT3rr0r

Trả lời

8

Từ những gì tôi hiểu, nó luôn xuất hiện như thể bộ đệm đã bị xóa sau khi ghi và luôn xuất hiện như thể đọc được tiến hành trực tiếp từ bộ nhớ khi đọc. Hiệu ứng là một Thread sẽ luôn thấy kết quả của việc ghi từ một Thread khác và (theo mô hình bộ nhớ Java) không bao giờ là một giá trị được lưu trữ. Việc thực hiện thực tế và hướng dẫn CPU sẽ khác nhau từ một kiến ​​trúc khác, tuy nhiên.

Nó không đảm bảo tính chính xác nếu bạn tăng biến trong nhiều hơn một chuỗi, hoặc kiểm tra giá trị của nó và thực hiện một số hành động vì rõ ràng là không có đồng bộ hóa thực sự. Nói chung, bạn chỉ có thể đảm bảo việc thực hiện chính xác nếu chỉ có chủ đề bằng văn bản cho biến và những người khác đều đang đọc. Cũng lưu ý rằng một biến không biến đổi 64 bit có thể được đọc/ghi dưới dạng hai biến 32 bit, do đó, các biến 32 bit là nguyên tử khi viết nhưng các biến 64 bit không phải là. Một nửa có thể được viết trước một thứ khác - vì vậy giá trị đọc có thể là giá trị cũ hoặc giá trị mới.

này là khá một trang hữu ích từ bookmark của tôi:

http://www.cs.umd.edu/~pugh/java/memoryModel/

+2

@jgubby: đoạn cuối của bạn có vẻ không chính xác: bạn không thể đọc một biến động 64 bit có 32 bit từ một ghi và 32 bit khác từ một lần ghi khác. – SyntaxT3rr0r

+1

@WizardOfOdds: Đồng ý. Có nghĩa là nói biến không biến động ở đó. – gubby

+0

@jbuggy: ah ah, đó là những gì tôi nghĩ nhưng tôi không dám sửa bài viết của bạn bởi vì tôi không chắc chắn những gì bạn có nghĩa là :) Vui mừng khi được giúp đỡ, bởi vì nếu không nó là kinda khó hiểu :))) – SyntaxT3rr0r

1

Chính xác những gì xảy ra là bộ xử lý cụ thể. Nói chung có một số hình thức hướng dẫn rào cản bộ nhớ. Việc dọn dẹp toàn bộ bộ nhớ cache rõ ràng sẽ rất tốn kém - có các giao thức kết hợp bộ nhớ cache trong phần cứng.

Cũng quan trọng, là một số tối ưu hóa không được thực hiện trên các truy cập trường. Trình biên dịch là quan trọng khi xem xét đa luồng, không chỉ nghĩ về phần cứng.

+1

Chính xác những gì xảy ra trong một chương trình Java được viết chính xác không phải là bộ xử lý cụ thể. – gubby

+0

@jgubby Câu hỏi đặt ra là liệu các hướng dẫn đặc biệt có được phát ra hay không. –

Các vấn đề liên quan