Trong khi cố gắng hiểu cách SubmissionPublisher
( mã nguồn trong Java SE 10, OpenJDK | docs ), một lớp mới được thêm vào Java SE trong phiên bản 9, đã được triển khai, tôi tình cờ thấy một vài lệnh gọi API VarHandle
mà trước đây tôi không biết:
fullFence
, acquireFence
, releaseFence
, loadLoadFence
Và storeStoreFence
.
Sau khi thực hiện một số nghiên cứu, đặc biệt là về khái niệm hàng rào / hàng rào bộ nhớ (tôi đã nghe nói về chúng trước đây, vâng, nhưng chưa bao giờ sử dụng chúng, do đó khá lạ lẫm với ngữ nghĩa của chúng), tôi nghĩ rằng tôi có hiểu biết cơ bản về những gì chúng dành cho . Tuy nhiên, vì câu hỏi của tôi có thể nảy sinh từ một quan niệm sai lầm, tôi muốn đảm bảo rằng tôi đã hiểu đúng ngay từ đầu:
Rào cản bộ nhớ đang sắp xếp lại các ràng buộc liên quan đến hoạt động đọc và viết.
Rào cản bộ nhớ có thể được phân loại thành hai loại chính: rào cản bộ nhớ hai chiều và hai chiều, tùy thuộc vào việc chúng có đặt các ràng buộc đối với việc đọc hoặc ghi hoặc cả hai.
C ++ hỗ trợ một loạt các rào cản bộ nhớ , tuy nhiên, những rào cản này không phù hợp với những rào cản được cung cấp bởi
VarHandle
. Tuy nhiên, một số trong những rào cản bộ nhớ còn trống trongVarHandle
cung cấp các hiệu ứng đặt hàng đó là tương thích với các rào cản C ++ bộ nhớ tương ứng của họ.#fullFence
tương thích vớiatomic_thread_fence(memory_order_seq_cst)
#acquireFence
tương thích vớiatomic_thread_fence(memory_order_acquire)
#releaseFence
tương thích vớiatomic_thread_fence(memory_order_release)
#loadLoadFence
và#storeStoreFence
không có phần truy cập C ++ tương thích
Từ tương thích dường như thực sự quan trọng ở đây vì ngữ nghĩa rõ ràng khác nhau khi nói đến các chi tiết. Chẳng hạn, tất cả các rào cản C ++ là hai chiều, trong khi các rào cản của Java không (nhất thiết).
- Hầu hết các rào cản bộ nhớ cũng có hiệu ứng đồng bộ hóa. Chúng đặc biệt phụ thuộc vào loại rào cản được sử dụng và hướng dẫn rào cản được thực hiện trước đó trong các luồng khác. Vì hàm ý đầy đủ mà một hướng dẫn về rào cản là dành riêng cho phần cứng, tôi sẽ gắn bó với các rào cản cấp cao hơn (C ++). Ví dụ, trong C ++, các thay đổi được thực hiện trước một lệnh rào cản phát hành được hiển thị cho một luồng thực hiện lệnh thu nhận rào cản.
Những giả định của tôi có đúng không? Nếu vậy, câu hỏi kết quả của tôi là:
Do các rào cản bộ nhớ có sẵn trong
VarHandle
bất kỳ loại đồng bộ hóa bộ nhớ?Bất kể chúng có gây ra sự đồng bộ hóa bộ nhớ hay không, những ràng buộc sắp xếp lại có thể hữu ích cho Java? Mô hình bộ nhớ Java đã đưa ra một số đảm bảo rất mạnh về việc đặt hàng khi có các trường, khóa hoặc
VarHandle
hoạt động dễ bay hơi như#compareAndSet
có liên quan.
Trong trường hợp bạn đang tìm kiếm một ví dụ: Đã nói ở trên BufferedSubscription
, một lớp bên trong SubmissionPublisher
(nguồn được liên kết ở trên), đã thiết lập một hàng rào đầy đủ trong dòng 1079 (chức năng growAndAdd
; vì trang web được liên kết không hỗ trợ định danh phân đoạn, chỉ cần CTRL + F cho nó ). Tuy nhiên, nó không rõ ràng cho tôi nó là gì cho.
plain -> opaque -> release/acquire -> volatile (sequential consistency)
.