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 VarHandlesebelumnya tidak saya sadari:
fullFence, acquireFence, releaseFence, loadLoadFenceDan 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 dalamVarHandlememberikan efek pemesanan yang kompatibel dengan hambatan memori C ++ yang sesuai.#fullFencekompatibel untukatomic_thread_fence(memory_order_seq_cst)#acquireFencekompatibel untukatomic_thread_fence(memory_order_acquire)#releaseFencekompatibel untukatomic_thread_fence(memory_order_release)#loadLoadFencedan#storeStoreFencetidak 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
VarHandlepenyebab 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
VarHandleoperasi seperti#compareAndSetterlibat.
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).