lazySet có thể được sử dụng cho giao tiếp giữa các luồng rmw, vì xchg là nguyên tử, đối với khả năng hiển thị, khi quy trình luồng người viết sửa đổi vị trí dòng bộ nhớ cache, bộ xử lý của luồng trình đọc sẽ nhìn thấy nó ở lần đọc tiếp theo, vì giao thức kết hợp bộ nhớ cache của cpu intel sẽ đảm bảo LazySet hoạt động, nhưng dòng bộ nhớ cache sẽ được cập nhật ở lần đọc tiếp theo, một lần nữa, CPU phải đủ hiện đại.
http://sc.tamu.edu/systems/eos/nehalem.pdf
Đối với Nehalem là nền tảng đa bộ xử lý, bộ xử lý có khả năng "rình mò" (nghe trộm) bus địa chỉ để truy cập của bộ xử lý khác vào bộ nhớ hệ thống và vào bộ nhớ đệm bên trong của họ. Họ sử dụng khả năng rình mò này để giữ cho bộ nhớ đệm bên trong của chúng phù hợp với cả bộ nhớ hệ thống và bộ nhớ đệm trong các bộ xử lý được kết nối với nhau khác. Nếu thông qua tính năng theo dõi, một bộ xử lý phát hiện ra rằng một bộ xử lý khác dự định ghi vào một vị trí bộ nhớ mà nó hiện đã lưu trong bộ nhớ đệm ở trạng thái Chia sẻ, bộ xử lý theo dõi sẽ làm mất hiệu lực khối bộ nhớ cache của nó buộc nó thực hiện lấp đầy dòng bộ nhớ đệm vào lần tiếp theo nó truy cập vào cùng một vị trí bộ nhớ .
oracle hotspot jdk cho kiến trúc cpu x86->
lazySet == secure.putOrderedLong == xchg rw (lệnh asm đóng vai trò như một rào cản mềm có giá 20 chu kỳ trên cpu intel nehelem)
trên x86 (x86_64) một rào cản như vậy có hiệu suất rẻ hơn nhiều so với dễ bay hơi hoặc AtomicLong getAndAdd,
Trong kịch bản một nhà sản xuất, một hàng đợi của người tiêu dùng, rào cản mềm xchg có thể buộc dòng mã trước lazySet (chuỗi + 1) cho chuỗi nhà sản xuất xảy ra TRƯỚC bất kỳ mã chuỗi người tiêu dùng nào sẽ sử dụng (hoạt động trên) dữ liệu mới, tất nhiên luồng người tiêu dùng sẽ cần phải kiểm tra nguyên tử xem trình tự nhà sản xuất đã được tăng lên bởi chính xác chưa bằng cách sử dụng CompareAndSet (chuỗi, chuỗi + 1).
Tôi đã truy tìm mã nguồn Hotspot để tìm ánh xạ chính xác của lazySet tới mã cpp:
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe. cpp
Unsafe_setOrderedLong -> Định nghĩa SET_FIELD_VOLATILE -> OrderAccess: release_store_fence. Đối với x86_64, OrderAccess: release_store_fence được định nghĩa là sử dụng lệnh xchg.
Bạn có thể xem cách nó được định nghĩa chính xác trong jdk7 (doug lea đang làm việc trên một số nội dung mới cho JDK 8):
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/4fc084dac61e/src/os_cpu/ linux_x86 / vm / orderAccess_linux_x86.inline.hpp
bạn cũng có thể sử dụng hdis để tháo rời tập hợp mã lazySet đang hoạt động.
Có một câu hỏi liên quan khác:
Chúng ta có cần mfence khi sử dụng xchg