जावा: एक थ्रेड में ऑब्जेक्ट को संशोधित करना, एकाधिक धागे में पढ़ना - जावा, एंड्रॉइड, मल्टीथ्रेडिंग, समवर्ती, थ्रेड-सुरक्षा

किसी ऑब्जेक्ट (जैसे हैश मैप या एक ऐरेलिस्ट या कुछ POJO) को थ्रेड सुरक्षा प्राप्त करने के लिए एक सामान्य दृष्टिकोण क्या होता है, हमेशा एक (समान) थ्रेड द्वारा संशोधित किया जाता है लेकिन एकाधिक धागे से इसका उपयोग किया जा सकता है?

हैश मैप मेरे लिए सबसे अधिक रुचि है लेकिन मुझे एक सामान्य दृष्टिकोण की आवश्यकता है।

क्या यह अस्थिर बनाने के लिए पर्याप्त है?

धन्यवाद।

उत्तर:

उत्तर № 1 के लिए 1

शायद आपको ConcurrentHashMap पर एक नज़र डालना चाहिए।

पब्लिक क्लास कंसूरेंट हैश मैप

सार मैप बढ़ाता है

ConcurrentMap लागू करता है, Serializable

एक हैश टेबल पूर्ण सहमति का समर्थन करता हैअद्यतन के लिए पुनर्प्राप्ति और उच्च अपेक्षित सहमति। यह वर्ग हैशटेबल के समान कार्यात्मक विनिर्देश का पालन करता है, और इसमें हैशटेबल की प्रत्येक विधि से संबंधित विधियों के संस्करण शामिल हैं। हालांकि, हालांकि सभी परिचालन थ्रेड-सुरक्षित हैं, फिर भी पुनर्प्राप्ति संचालन लॉकिंग में शामिल नहीं होते हैं, और पूरी तालिका को इस तरह से लॉक करने के लिए कोई समर्थन नहीं है जो सभी पहुंच को रोकता है। यह वर्ग उन कार्यक्रमों में हैशटेबल के साथ पूरी तरह से अंतःक्रियाशील है जो इसकी थ्रेड सुरक्षा पर भरोसा करते हैं लेकिन इसके सिंक्रनाइज़ेशन विवरण पर नहीं।

पुनर्प्राप्ति संचालन (प्राप्त करने सहित) आम तौर पर करते हैंब्लॉक न करें, इसलिए अपडेट ऑपरेशंस (डाल और निकालने सहित) के साथ ओवरलैप हो सकता है। पुनर्प्राप्ति उनके प्रारंभ होने पर हाल ही में किए गए नवीनतम अपडेट ऑपरेशन के परिणामों को दर्शाती है। (अधिक औपचारिक रूप से, किसी दिए गए कुंजी के लिए एक अद्यतन ऑपरेशन किसी कुंजी (गैर-शून्य) पुनर्प्राप्ति के साथ अद्यतन मूल्य की रिपोर्टिंग के लिए होता है।) कुल संचालन जैसे कि PutAll और clear, समवर्ती पुनर्प्राप्ति सम्मिलन या निष्कासन को प्रतिबिंबित कर सकता है केवल कुछ प्रविष्टियों में से। इसी प्रकार, इटरेटर, स्प्लिटरेटर्स और एन्युमरेशन इशारा / गणना के निर्माण के बाद या उसके बाद से किसी बिंदु पर हैश तालिका की स्थिति को प्रतिबिंबित करने वाले तत्व लौटते हैं। वे ConcurrentModificationException फेंक नहीं है। हालांकि, इटेटर को एक समय में केवल एक धागे द्वारा उपयोग करने के लिए डिज़ाइन किया गया है। ध्यान रखें कि आकार सहित समेकित स्थिति विधियों के परिणाम, लक्षण हैं, और इसमें वैल्यू आमतौर पर उपयोगी होते हैं जब कोई नक्शा अन्य धागे में समवर्ती अद्यतनों से गुजरता नहीं है। अन्यथा इन तरीकों के परिणाम क्षणिक राज्यों को प्रतिबिंबित करते हैं जो निगरानी या आकलन उद्देश्यों के लिए पर्याप्त हो सकते हैं, लेकिन कार्यक्रम नियंत्रण के लिए नहीं।

यहां अधिक जानकारी: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

यह शास्त्रीय हैशप की तरह प्रोग्रामेटिक रूप से व्यवहार करता है।


उत्तर № 2 के लिए 1

एक सामान्य दृष्टिकोण लागू करना आसान नहीं होगाऔर आपके हिस्से पर बहुत मेहनत की आवश्यकता होगी, और फिर भी चीजें गलत हो जाएंगी (क्योंकि यह बहुत मुश्किल है)। तो, गोमोकू 7 द्वारा सुझाए गए अनुसार आपकी सबसे अच्छी शर्त ConcurrentHashMap है।

जेनेरिक दृष्टिकोण को ताले के आधार पर कार्यान्वयन की आवश्यकता होगी। अपडेट से पहले ऑब्जेक्ट लॉक करना होगा और बाद में लॉक जारी करना होगा। वह अलग अलग है ताले के प्रकार जावा में तो, ताले चुने गए जो आपकी ज़रूरत के अनुरूप हैं। कुछ सुझाव हैं:

  1. Final आपका मित्र है, वस्तुओं को तब तक म्यूट न करें जब तक यह आवश्यक न हो, वस्तुओं को बनाओ final जहां संभव
  2. अस्थायी चर बनाने से बचें
  3. उपयोग निष्पादकों तथा कांटा / शामिल हों जहां संभव

संबंधित सवाल
सबसे लोकप्रिय