2013-08-28 38 views
7

Tôi đang xem xét một biến được đồng bộ hóa và biến động hoạt động như thế nào trong java và tôi bắt gặp một khái niệm gọi là rào cản đọc và viết. Bất cứ ai có thể giúp tôi hiểu ý nghĩa của điều khoản nàycác rào cản đọc và viết các rào cản trong khối đồng bộ

+4

Cậu nhìn vào [1.787.450] (http://stackoverflow.com/questions/1787450) ? – ADTC

+0

Xem xét điều này: http://stackoverflow.com/questions/1787450/how-do-i-understand-read-memory-barriers-and-volatile – Saint

+0

thực sự hữu ích! Cảm ơn bạn – csk

Trả lời

0

Khi bạn nhập một khối mã được đồng bộ, bạn vượt qua "rào cản đọc" và khi nó được thoát, bạn vượt qua "rào cản viết".

Được sử dụng để tham chiếu đến các thuộc tính dễ bay hơi và đưa ra chỉ báo khi Chủ đề cần cập nhật giá trị của các thuộc tính dễ bay hơi. Họ nên cập nhật nó khi họ vượt qua rào cản đọc nếu bất cứ ai khác vượt qua rào cản viết.

Đọc tương tự từ thuộc tính dễ bay hơi làm cho chuỗi chủ đề vượt qua hàng rào đọc và ghi vào thuộc tính dễ bay hơi khiến bạn vượt qua hàng rào ghi, do đó có nhiều chi tiết hơn khối đồng bộ.

2

A rào cản bộ nhớ là một "dòng" khái niệm trong mã của bạn ngăn trình biên dịch thực hiện tối ưu nhất định và có thể chèn các lệnh "đồng bộ hóa" đặc biệt vào bộ xử lý. Thông thường, trình biên dịch có thể xem xét trong một phương thức cụ thể và thấy rằng một số hướng dẫn nhất định có thể được di chuyển xung quanh mà không thay đổi ý nghĩa của mã. Ví dụ, nếu bạn có

int x = 0, y = 0; 
x++; 
y++; 

Nếu trình biên dịch tìm ra rằng có một số lợi ích, nó mã thay vì có thể đầu ra cho

y++; 
x++; 

Tuy nhiên, nếu xy là các trường trong một số lớp, do đó họ có thể được nhìn thấy từ các chủ đề khác, các chủ đề khác có thể được sửa đổi các giá trị trong khi phương pháp của bạn đang chạy.

Rào cản bộ nhớ buộc trình biên dịch kiểm tra lại giá trị của các biến cụ thể (trong Java, đó là các biến số volatileAtomic*) trong trường hợp một số luồng khác đã sửa đổi chúng trong khi phương thức đang chạy và nó giữ nguyên trình biên dịch từ việc thực hiện sắp xếp lại có thể vô tình thay đổi kết quả của phép tính. Trên các hệ thống hỗ trợ nhiều lõi/bộ xử lý, trình biên dịch cũng sẽ buộc bộ xử lý kiểm tra để đảm bảo rằng một số bộ xử lý hoặc thiết bị phần cứng khác đã không sửa đổi biến trong thời gian chờ đợi. Java (như của Java 5) có một bộ quy tắc rất được xác định rõ ràng về cách thức hoạt động của nó được gọi là happens-before.

This FAQ có một số giải thích hữu ích được viết tại thời điểm Mô hình bộ nhớ Java đang được phát triển. Lưu ý rằng mặc dù khái niệm về rào cản bộ nhớ là ngôn ngữ chéo, hầu hết các ngôn ngữ không có các quy tắc được xác định rõ ràng về chúng như Java.

+0

Câu trả lời chủ yếu là tốt, nhưng bộ nhớ rào cản không chỉ là khái niệm biên dịch mà còn là khái niệm phần cứng. Bộ vi xử lý có thể có bộ đệm cục bộ ngăn không cho chúng xem các bản cập nhật cho bộ nhớ được tạo trong các luồng khác (chạy trên các bộ xử lý khác trong cùng một hệ thống); một số hướng dẫn xử lý nhất định có thể được sử dụng để xóa các cache này hoặc ép buộc các ngữ nghĩa đọc/đọc qua. – davmac

+0

Điểm tốt và tôi sẽ chỉnh sửa để phản ánh điều đó. (Đã dành quá nhiều thời gian gần đây cho các bộ vi xử lý không có bộ đệm nào cả ...) – chrylis

0

Các rào cản đọc và viết được sử dụng để thực hiện ngữ nghĩa của Mô hình bộ nhớ Java ở mức thấp nhất bởi các JVM.

Tuy nhiên, thuật ngữ đó không có trong Đặc tả ngôn ngữ Java, chỉ có các lý do về mối quan hệ xảy ra trước mối quan hệ.Đặc biệt

  • một ghi vào một biến bất ổn xảy ra-trước khi đọc tiếp theo của cùng một biến
  • thoát một khối đồng bộ xảy ra-trước một mục tiếp theo đó khối syncchronized cùng

Khi một mối quan hệ xảy ra trước khi tồn tại giữa hai hành động trong chương trình của bạn, bạn có đảm bảo rằng hai hành động đó sẽ được thực hiện theo thứ tự liên tục (ví dụ như chỉ có một luồng và không có sắp xếp lại không trực quan).

Việc đưa vào chi tiết triển khai của các JVM là không cần thiết để viết chương trình đa luồng chính xác. Tuy nhiên, nếu bạn muốn các chi tiết đẫm máu, các JSR-133 cookbook là một thú vị đọc.

5

(các câu trả lời trên là khá đầy đủ), tôi chỉ muốn chứng minh khái niệm với một chương trình đơn giản

Thread 1                Thread 2 


    |   
    |                  
    |                  | 
    |                  | 
    | Everything Thread 1             | 
    | wrote before here             | 
    |                  | 
    |                  | 
    _ _ _ _ _ _ _ _ _ _             | 
     (write barrier)   (happens before)   (read barrier) | 
    |              _ _ _ _ _ _ _ _ 
    | 
    |             is guaranteed  | 
    |             to be visible to | 
    |             Thread 2   | 
    |                  | 
Các vấn đề liên quan