Whilst समझने की कोशिश कर रहा है कि कैसे SubmissionPublisher
( जावा एसई 10 में स्रोत कोड, OpenJDK | डॉक्स ), संस्करण 9 में जावा एसई में एक नया वर्ग जोड़ा गया है, इसे लागू किया गया है, मुझे कुछ एपीआई कॉल में ठोकर लगी, जिसकी मुझे VarHandle
पहले जानकारी नहीं थी:
fullFence
, acquireFence
, releaseFence
, loadLoadFence
और storeStoreFence
।
कुछ शोध करने के बाद, विशेष रूप से स्मृति बाधाओं / बाड़ की अवधारणा के बारे में (मैंने पहले उनके बारे में सुना है, हाँ, लेकिन उनका इस्तेमाल कभी नहीं किया, इस प्रकार उनके शब्दार्थों से काफी अपरिचित थे), मुझे लगता है कि मुझे इस बात की एक बुनियादी समझ है कि वे किस लिए हैं । फिर भी, जैसा कि मेरे सवाल एक गलत धारणा से उत्पन्न हो सकते हैं, मैं यह सुनिश्चित करना चाहता हूं कि मुझे यह पहली बार में सही लगे:
मेमोरी बाधाएं पढ़ने और लिखने के संचालन के संबंध में बाधाओं का पुन: निर्धारण कर रही हैं।
मेमोरी बैरियर को दो मुख्य श्रेणियों में वर्गीकृत किया जा सकता है: यूनिडायरेक्शनल और बिडायरेक्शनल मेमोरी बैरियर, इस पर निर्भर करता है कि वे बाधाओं को या तो पढ़ते हैं या लिखते हैं या दोनों को सेट करते हैं।
C ++ विभिन्न प्रकार की मेमोरी बाधाओं का समर्थन करता है , हालांकि, ये उनके द्वारा प्रदान किए गए लोगों के साथ मेल नहीं खाते हैं
VarHandle
। हालाँकि, उपलब्ध स्मृति अवरोधकों में से कुछ क्रमबद्ध प्रभावVarHandle
प्रदान करते हैं जो उनके संगत C ++ मेमोरी अवरोधों के अनुकूल होते हैं ।#fullFence
संगत हैatomic_thread_fence(memory_order_seq_cst)
#acquireFence
संगत हैatomic_thread_fence(memory_order_acquire)
#releaseFence
संगत हैatomic_thread_fence(memory_order_release)
#loadLoadFence
और#storeStoreFence
कोई संगत C ++ काउंटर भाग नहीं है
शब्द संगत वास्तव में यहाँ महत्वपूर्ण लगता है क्योंकि जब यह विवरण आता है तो शब्दार्थ स्पष्ट रूप से भिन्न होता है। उदाहरण के लिए, सभी C ++ बैरियर अप्रत्यक्ष हैं, जबकि जावा के अवरोध (आवश्यक) नहीं हैं।
- अधिकांश मेमोरी बैरियर्स में सिंक्रोनाइज़ेशन इफेक्ट भी होते हैं। वे विशेष रूप से प्रयुक्त बाधा प्रकार और अन्य थ्रेड्स में पहले से निष्पादित बैरियर निर्देशों पर निर्भर करते हैं। पूर्ण निहितार्थ के रूप में एक बाधा निर्देश हार्डवेयर-विशिष्ट है, मैं उच्च-स्तरीय (C ++) अवरोधों के साथ रहूँगा। C ++ में, उदाहरण के लिए, परिवर्तन किए एक से पहले रिहाई बाधा अनुदेश एक धागा एक को क्रियान्वित करने के लिए दिखाई दे रहे हैं अधिग्रहण बाधा अनुदेश।
क्या मेरी धारणाएँ सही हैं? यदि हां, तो मेरे परिणामी प्रश्न हैं:
क्या मेमोरी अवरोध
VarHandle
किसी भी प्रकार के मेमोरी सिंक्रोनाइज़ेशन के कारण उपलब्ध हैं ?भले ही वे मेमोरी सिंक्रोनाइज़ेशन का कारण बनते हों या नहीं, जावा में फिर से काम करने में बाधाएं क्या हो सकती हैं? जावा मेमोरी मॉडल पहले से ही ऑर्डर के संबंध में कुछ बहुत मजबूत गारंटी देता है जब अस्थिर क्षेत्र, ताले या
VarHandle
संचालन#compareAndSet
शामिल होते हैं।
मामले में आप एक उदाहरण की तलाश कर रहे हैं: उपरोक्त BufferedSubscription
, SubmissionPublisher
(ऊपर से जुड़ा हुआ स्रोत) का एक आंतरिक वर्ग , लाइन 1079 (फ़ंक्शन में पूर्ण बाड़ स्थापित किया है growAndAdd
; जैसा कि लिंक की गई वेबसाइट टुकड़ा पहचानकर्ताओं का समर्थन नहीं करती है, बस इसके लिए CTRL + F है। )। हालाँकि, यह मेरे लिए अस्पष्ट है कि यह किस लिए है।
plain -> opaque -> release/acquire -> volatile (sequential consistency)
:।