lazySet สามารถใช้สำหรับการสื่อสาร rmw inter thread เนื่องจาก xchg เป็นอะตอมสำหรับการมองเห็นเมื่อกระบวนการเธรดผู้เขียนแก้ไขตำแหน่งบรรทัดแคชโปรเซสเซอร์ของเธรดผู้อ่านจะเห็นในการอ่านครั้งถัดไปเนื่องจากโปรโตคอลการเชื่อมต่อแคชของซีพียู intel จะรับประกัน LazySet ใช้งานได้ แต่บรรทัดแคชจะได้รับการอัปเดตในการอ่านครั้งถัดไปอีกครั้งซีพียูจะต้องทันสมัยเพียงพอ
http://sc.tamu.edu/systems/eos/nehalem.pdf
สำหรับ Nehalem ซึ่งเป็นแพลตฟอร์มแบบหลายโปรเซสเซอร์โปรเซสเซอร์จะมีความสามารถในการ "สอดแนม" (ดักฟัง) บัสแอดเดรสสำหรับการเข้าถึงหน่วยความจำระบบของโปรเซสเซอร์อื่นและ ไปยังแคชภายในของพวกเขา พวกเขาใช้ความสามารถในการสอดแนมนี้เพื่อให้แคชภายในสอดคล้องกันทั้งกับหน่วยความจำระบบและแคชในโปรเซสเซอร์อื่น ๆ ที่เชื่อมต่อกัน หากผ่านการสอดแนมโปรเซสเซอร์ตัวหนึ่งตรวจพบว่าโปรเซสเซอร์อื่นตั้งใจที่จะเขียนไปยังตำแหน่งหน่วยความจำที่ปัจจุบันได้แคชไว้ในสถานะ Shared หน่วยประมวลผลการสอดแนมจะทำให้บล็อกแคชเป็นโมฆะบังคับให้ดำเนินการกรอกบรรทัดแคชในครั้งต่อไปที่เข้าถึงตำแหน่งหน่วยความจำเดียวกัน .
oracle hotspot jdk สำหรับสถาปัตยกรรม x86 cpu ->
lazySet == unsafe.putOrderLong == xchg rw (คำสั่ง asm ที่ทำหน้าที่เป็น soft barrier ซึ่งคิดราคา 20 รอบบน nehelem intel cpu)
บน x86 (x86_64) อุปสรรคดังกล่าวมีประสิทธิภาพที่ถูกกว่ามากเมื่อเทียบกับการระเหยหรือ AtomicLong getAndAdd
ในผู้ผลิตรายเดียวสถานการณ์คิวผู้บริโภคหนึ่งตัว xchg soft barrier สามารถบังคับให้บรรทัดของโค้ดก่อน lazySet (ลำดับ + 1) สำหรับเธรดผู้ผลิตก่อนที่โค้ดเธรดผู้บริโภคใด ๆ ที่จะใช้ (ทำงานบน) ข้อมูลใหม่แน่นอน เธรดผู้บริโภคจะต้องตรวจสอบแบบอะตอมว่าลำดับผู้ผลิตเพิ่มขึ้นทีละหนึ่งโดยใช้ CompareAndSet (ลำดับ, ลำดับ + 1)
ฉันติดตามซอร์สโค้ด Hotspot เพื่อค้นหาการแมปที่แน่นอนของรหัส lazySet กับ cpp:
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe cpp
Unsafe_setOreledLong -> นิยาม SET_FIELD_VOLATILE -> OrderAccess: release_store_fence สำหรับ x86_64 OrderAccess: release_store_fence ถูกกำหนดโดยใช้คำสั่ง xchg
คุณสามารถดูว่ามันถูกกำหนดไว้อย่างไรใน jdk7 (doug lea กำลังทำงานกับสิ่งใหม่ ๆ สำหรับ JDK 8):
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/4fc084dac61e/src/os_cpu/ linux_x86 / เมล์ / orderAccess_linux_x86.inline.hpp
คุณยังสามารถใช้ hdis เพื่อถอดประกอบการทำงานของรหัส lazySet
มีคำถามอื่นที่เกี่ยวข้อง:
เราต้องการ mfence เมื่อใช้ xchg หรือไม่