lazySet dapat digunakan untuk komunikasi antar thread rmw, karena xchg bersifat atomic, sedangkan untuk visibilitas, ketika proses thread penulis mengubah lokasi baris cache, prosesor thread pembaca akan melihatnya di pembacaan berikutnya, karena protokol koherensi cache intel cpu akan menjamin LazySet berfungsi, tetapi baris cache akan diperbarui pada pembacaan berikutnya, sekali lagi, CPU harus cukup modern.
http://sc.tamu.edu/systems/eos/nehalem.pdf
Untuk Nehalem yang merupakan platform multi-prosesor, prosesor memiliki kemampuan untuk "mengintip" (menguping) bus alamat untuk akses prosesor lain ke memori sistem dan ke cache internal mereka. Mereka menggunakan kemampuan pengintaian ini untuk menjaga agar cache internal mereka tetap konsisten baik dengan memori sistem maupun dengan cache di prosesor lain yang saling berhubungan. Jika melalui pengintaian, satu prosesor mendeteksi bahwa prosesor lain bermaksud untuk menulis ke lokasi memori yang saat ini telah di-cache dalam status Bersama, prosesor pengintai akan membatalkan blok cache-nya dan memaksanya untuk melakukan pengisian baris cache saat berikutnya mengakses lokasi memori yang sama .
oracle hotspot jdk untuk arsitektur cpu x86->
lazySet == unsafe.putOrderedLong == xchg rw (instruksi asm yang berfungsi sebagai penghalang lunak selama 20 siklus pada nehelem intel cpu)
pada x86 (x86_64) penghalang seperti itu jauh lebih murah dari segi kinerja daripada volatile atau AtomicLong getAndAdd,
Dalam satu produsen, satu skenario antrian konsumen, xchg soft barrier dapat memaksa baris kode sebelum lazySet (urutan + 1) untuk thread produsen terjadi SEBELUM kode thread konsumen yang akan mengkonsumsi (mengerjakan) data baru, tentu saja utas konsumen perlu memeriksa secara atomis bahwa urutan produsen bertambah tepat satu menggunakan bandingkanAndSet (urutan, urutan + 1).
Saya menelusuri setelah kode sumber Hotspot untuk menemukan pemetaan yang tepat dari lazySet ke kode cpp:
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe. cpp
Unsafe_setOrderedLong -> definisi SET_FIELD_VOLATILE -> OrderAccess: release_store_fence. Untuk x86_64, OrderAccess: release_store_fence didefinisikan sebagai menggunakan instruksi xchg.
Anda dapat melihat bagaimana tepatnya didefinisikan di jdk7 (doug lea bekerja pada beberapa hal baru untuk JDK 8):
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/4fc084dac61e/src/os_cpu/ linux_x86 / vm / orderAccess_linux_x86.inline.hpp
Anda juga dapat menggunakan hdis untuk membongkar perakitan kode lazySet.
Ada pertanyaan terkait lainnya:
Apakah kita membutuhkan mfence saat menggunakan xchg