lazySet, rmw inter thread iletişimi için kullanılabilir, çünkü xchg atomiktir, görünürlük açısından, yazıcı iş parçacığı işlemi bir önbellek satırı konumunu değiştirdiğinde, okuyucu iş parçacığının işlemcisi bunu bir sonraki okumada görecek, çünkü intel cpu'nun önbellek tutarlılık protokolü garantili olacaktır LazySet çalışıyor, ancak önbellek satırı bir sonraki okumada güncellenecek, yine CPU'nun yeterince modern olması gerekiyor.
http://sc.tamu.edu/systems/eos/nehalem.pdf
Çok işlemcili bir platform olan Nehalem için işlemciler, diğer işlemcilerin sistem belleğine erişimleri için adres veriyolunu "gözetleme" (gizli dinleme) ve dahili önbelleklerine. Dahili önbelleklerini hem sistem belleğiyle hem de birbirine bağlı diğer işlemcilerdeki önbelleklerle tutarlı tutmak için bu gözetleme yeteneğini kullanırlar. Bir işlemci, gözetleme yoluyla, başka bir işlemcinin Paylaşılan durumda o anda önbelleğe aldığı bir bellek konumuna yazma niyetinde olduğunu tespit ederse, gözetleme işlemcisi, önbellek bloğunu geçersiz kılarak, aynı bellek konumuna bir daha eriştiğinde bir önbellek satırı doldurmaya zorlar. .
x86 cpu mimarisi için oracle hotspot jdk->
lazySet == unsafe.putOrderedLong == xchg rw (nehelem intel cpu üzerinde 20 çevrime mal olan yumuşak bir bariyer görevi gören asm talimatı)
x86 (x86_64) üzerinde böyle bir engel, performans açısından uçucu veya AtomicLong getAndAdd'den çok daha ucuzdur,
Bir üreticide, tek bir tüketici kuyruğu senaryosunda, xchg soft barrier, üretici iş parçacığı için yeni verileri tüketecek (üzerinde çalışacak) herhangi bir tüketici iş parçacığı kodundan ÖNCE kod satırını lazySet'ten (sıra + 1) önce zorlayabilir. tüketici iş parçacığının, bir ComparAndSet (sıra, sıra + 1) kullanarak üretici sırasının tam olarak bir arttığını atomik olarak kontrol etmesi gerekecektir.
LazySet'in cpp koduna tam olarak eşlenmesini bulmak için Hotspot kaynak kodunun izini sürdüm:
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe. cpp
Unsafe_setOrderedLong -> SET_FIELD_VOLATILE tanımı -> OrderAccess: release_store_fence. X86_64 için OrderAccess: release_store_fence, xchg komutunu kullanarak tanımlanır.
Jdk7'de tam olarak nasıl tanımlandığını görebilirsiniz (doug lea, JDK 8 için bazı yeni şeyler üzerinde çalışıyor):
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/4fc084dac61e/src/os_cpu/ linux_x86 / vm / orderAccess_linux_x86.inline.hpp
lazySet kodunun derlemesini çalışırken sökmek için hdis'i de kullanabilirsiniz.
Bununla ilgili başka bir soru daha var:
xchg kullanırken mfence'e ihtiyacımız var mı