lazySet का उपयोग rmw इंटर थ्रेड कम्युनिकेशन के लिए किया जा सकता है, क्योंकि xchg परमाणु है, दृश्यता के लिए, जब लेखक थ्रेड प्रक्रिया एक कैश लाइन लोकेशन को संशोधित करती है, तो रीडर थ्रेड का प्रोसेसर इसे अगले रीड पर देखेगा, क्योंकि इंटेल सीपीयू का कैश कोऑरेन्स प्रोटोकॉल garantee होगा LazySet काम करता है, लेकिन कैश लाइन को अगले रीड में अपडेट किया जाएगा, फिर से, सीपीयू को पर्याप्त आधुनिक बनाना होगा।
http://sc.tamu.edu/systems/eos/nehalem.pdf
नेह्म के लिए जो कि एक मल्टी-प्रोसेसर प्लेटफॉर्म है, प्रोसेसर के पास सिस्टम मेमोरी और अन्य प्रोसेसर के एक्सेस के लिए एड्रेस बस "स्नूप" (ईवॉड्र्स) की क्षमता है। उनके आंतरिक कैश के लिए। वे अपने आंतरिक कैश को सिस्टम मेमोरी और अन्य इंटरकनेक्टेड प्रोसेसर में कैश के साथ संगत रखने के लिए इस स्नूपिंग क्षमता का उपयोग करते हैं। यदि स्नूपिंग के माध्यम से एक प्रोसेसर यह पता लगाता है कि एक अन्य प्रोसेसर एक मेमोरी लोकेशन पर लिखने का इरादा रखता है जिसे उसने वर्तमान में साझा स्थिति में कैश किया है, तो स्नूपिंग प्रोसेसर उसके कैश ब्लॉक को अमान्य कर देगा जिससे वह कैश लाइन का प्रदर्शन करने के लिए अगली बार उसी मेमोरी लोकेशन को भर सके। ।
x86 cpu आर्किटेक्चर के लिए oracle हॉटस्पॉट jdk->
lazySet == unsafe.putOrderedLong == xchg rw (asm निर्देश जो नेहेम इंटेल सीपीयू पर 20 चक्रों की लागत वाली एक नरम बाधा के रूप में कार्य करता है)
x86 (x86_64) पर ऐसा अवरोध अस्थिर या एटॉमिकलॉन्ग getAndAdd की तुलना में बहुत सस्ता प्रदर्शन-वार है,
एक निर्माता, एक उपभोक्ता कतार परिदृश्य में, xchg सॉफ्ट बैरियर, निर्माता थ्रेड के लिए लेज़सेट (अनुक्रम + 1) से पहले कोड की लाइन को बाध्य कर सकता है ताकि कोई भी उपभोक्ता थ्रेड कोड हो, जो नए डेटा का उपभोग (कार्य) करेगा, उपभोक्ता थ्रेड को एटोमिकली जांचने की आवश्यकता होगी कि प्रोडयूसर सीक्वेंस को एक तुलना एसेटसेट (सीक्वेंस, सीक्वेंस + ए) का उपयोग करके बढ़ाया गया था।
मैंने हॉटस्पॉट स्रोत कोड के बाद lppSet से cpp कोड की सटीक मैपिंग का पता लगाने के लिए पता लगाया:
http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe। cpp
Unsafe_setOrderedLong -> SET_FIELD_VOLATILE परिभाषा -> क्रमबद्ध: release_store_fence। X86_64 के लिए, OrderAccess: release_store_fence को xchg निर्देश के उपयोग के रूप में परिभाषित किया गया है।
आप यह देख सकते हैं कि यह वास्तव में jdk7 में कैसे परिभाषित किया गया है (JDK 8 के लिए कुछ नए सामान पर काम कर रहा है):
http://hg.openjdk.java.net/jdk7/jdk7/hotdot/file/4fc084dac61e/src/os_cpu/ linux_x86 / VM / orderAccess_linux_x86.inline.hpp
आप कार्रवाई में lazySet कोड की असेंबली को अलग करने के लिए भी hdis का उपयोग कर सकते हैं।
एक और संबंधित प्रश्न है:
क्या हमें xchg का उपयोग करते समय mfence की आवश्यकता है