Ketika mencoba memahami bagaimana SubmissionPublisher
( kode sumber di Java SE 10, OpenJDK | docs ), sebuah kelas baru yang ditambahkan ke Java SE dalam versi 9, telah diterapkan, saya menemukan beberapa panggilan API yang VarHandle
sebelumnya tidak saya sadari:
fullFence
, acquireFence
, releaseFence
, loadLoadFence
Dan storeStoreFence
.
Setelah melakukan beberapa penelitian, terutama mengenai konsep hambatan / pagar ingatan (saya pernah mendengar tentang mereka sebelumnya, ya; tetapi tidak pernah menggunakannya, sehingga cukup tidak terbiasa dengan semantik mereka), saya pikir saya memiliki pemahaman dasar tentang apa itu untuk . Meskipun demikian, karena pertanyaan saya mungkin timbul dari kesalahpahaman, saya ingin memastikan bahwa saya telah melakukannya dengan benar:
Hambatan ingatan adalah kendala menata ulang tentang operasi membaca dan menulis.
Hambatan memori dapat dikategorikan ke dalam dua kategori utama: hambatan memori searah dan dua arah, tergantung pada apakah mereka menetapkan batasan baik membaca atau menulis atau keduanya.
C ++ mendukung berbagai hambatan memori , namun, ini tidak cocok dengan yang disediakan oleh
VarHandle
. Namun, beberapa hambatan memori yang tersedia dalamVarHandle
memberikan efek pemesanan yang kompatibel dengan hambatan memori C ++ yang sesuai.#fullFence
kompatibel untukatomic_thread_fence(memory_order_seq_cst)
#acquireFence
kompatibel untukatomic_thread_fence(memory_order_acquire)
#releaseFence
kompatibel untukatomic_thread_fence(memory_order_release)
#loadLoadFence
dan#storeStoreFence
tidak memiliki bagian penghitung C ++ yang kompatibel
Kata yang kompatibel tampaknya sangat penting di sini karena semantiknya jelas berbeda dalam hal perincian. Sebagai contoh, semua hambatan C ++ adalah dua arah, sedangkan hambatan Java tidak (harus).
- Sebagian besar hambatan memori juga memiliki efek sinkronisasi. Itu terutama tergantung pada jenis penghalang yang digunakan dan instruksi penghalang yang sebelumnya dieksekusi di utas lainnya. Karena implikasi penuh dari instruksi penghalang adalah spesifik untuk perangkat keras, saya akan tetap menggunakan penghalang level lebih tinggi (C ++). Dalam C ++, misalnya, perubahan yang dibuat sebelum instruksi barrier rilis terlihat oleh thread yang menjalankan instruksi barrier memperoleh .
Apakah asumsi saya benar? Jika demikian, pertanyaan saya yang muncul adalah:
Apakah hambatan memori tersedia dalam
VarHandle
penyebab sinkronisasi jenis apa pun?Terlepas dari apakah mereka menyebabkan sinkronisasi memori atau tidak, kendala pemesanan ulang apa yang berguna untuk Java? Java Memory Model sudah memberikan jaminan yang sangat kuat terkait pemesanan ketika bidang yang mudah berubah, kunci atau
VarHandle
operasi seperti#compareAndSet
terlibat.
Jika Anda mencari contoh: Yang disebutkan di atas BufferedSubscription
, kelas dalam dari SubmissionPublisher
(sumber terkait di atas), membuat pagar penuh di baris 1079 (berfungsi growAndAdd
; karena situs web yang ditautkan tidak mendukung pengidentifikasi fragmen, hanya CTRL + F untuk itu ). Namun, tidak jelas bagi saya untuk apa itu.
plain -> opaque -> release/acquire -> volatile (sequential consistency)
.