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ộ
Trả lời
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ộ.
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 x
và y
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ố volatile
và Atomic*
) 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.
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
Đ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
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.
(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 |
| |
- 1. Rào cản không đồng bộ trong F #
- 2. Rào cản đồng bộ hóa Qt?
- 3. Rào cản liên khối trên CUDA
- 4. Rào cản bộ nhớ và ví dụ java.util.concurrent.locks.Condition
- 5. C + + Các rào cản bộ nhớ cho nguyên tử
- 6. Triển khai rào cản java tùy chỉnh
- 7. Tại sao tôi cần một rào cản bộ nhớ?
- 8. Các rào cản bộ nhớ và các hoạt động liên khóa
- 9. Trong OpenCL, mem_fence() làm gì, trái với rào cản()?
- 10. Là viết thư cho một rào cản bộ nhớ dễ bay hơi trong Java
- 11. Các rào cản bộ nhớ có cần thiết khi tham gia vào một chuỗi không?
- 12. WaitForSingleObject có phục vụ như một rào cản bộ nhớ không?
- 13. Rào cản bộ nhớ trong không gian người dùng? (Linux, x86-64)
- 14. Ổ khóa có luôn đòi hỏi một rào cản bộ nhớ không? Quay trên hàng rào bộ nhớ có đắt không?
- 15. như thế nào là một rào cản bộ nhớ trong kernel Linux được sử dụng
- 16. Làm cách nào để phân chia các rào cản giữa phát triển và QA đối với một dự án nhanh?
- 17. Chọn một chuỗi để thực hiện hành động rào cản - Java CyclicBarrier
- 18. Khi nào thì rào cản bộ nhớ chỉ biên dịch (chẳng hạn như std :: atomic_signal_fence) hữu ích?
- 19. Có một rào cản ngầm tiềm ẩn sau phần quan trọng omp
- 20. Khi nào an toàn để phá hủy một rào cản pthread?
- 21. Sử dụng đối tượng đồng bộ hàng rào trong OpenGL
- 22. Hàng rào bộ nhớ - Cần trợ giúp để hiểu
- 23. 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ớ?
- 24. Tại sao hạt EJB với các giao dịch được quản lý bằng bean hoạt động như một "rào cản giao dịch"?
- 25. Tại sao hàng rào đồng bộ hóa bộ nhớ chia sẻ khi memoryBarrier không?
- 26. Có thể thay thế các hàng rào không?
- 27. Chức năng mutex_unlock có phải là hàng rào bộ nhớ không?
- 28. Django unique_together không ngăn cản các bản sao
- 29. Một số câu hỏi về đồng bộ hóa chủ đề
- 30. Hiểu không đồng bộ hóa thread chặn và Thread.MemoryBarrier
Cậu nhìn vào [1.787.450] (http://stackoverflow.com/questions/1787450) ? – ADTC
Xem xét điều này: http://stackoverflow.com/questions/1787450/how-do-i-understand-read-memory-barriers-and-volatile – Saint
thực sự hữu ích! Cảm ơn bạn – csk