2009-08-18 16 views

उत्तर

64

सिंक्रनाइज़ HashMap:

  1. प्रत्येक विधि एक वस्तु के स्तर का ताला का उपयोग कर समन्वयित है। तो synchMap पर प्राप्त करें और डालें विधियां लॉक प्राप्त करें।

  2. पूरे संग्रह को लॉक करना एक प्रदर्शन ओवरहेड है। जबकि एक थ्रेड लॉक पर रहता है, कोई अन्य थ्रेड संग्रह का उपयोग नहीं कर सकता है।

ConcurrentHashMap JDK 5.

  1. में पेश किया गया था वहाँ वस्तु स्तर पर कोई ताला है, लॉकिंग एक बहुत अधिक विस्तृत रूप में है। ConcurrentHashMap के लिए, ताले एक हैशप बाल्टी स्तर पर हो सकते हैं।

  2. निचले स्तर के लॉकिंग का प्रभाव यह है कि आप समवर्ती पाठकों और लेखकों के साथ मिल सकते हैं जो सिंक्रनाइज़ किए गए संग्रह के लिए संभव नहीं है। इससे अधिक स्केलेबिलिटी होती है।

  3. ConcurrentHashMapConcurrentModificationException फेंक नहीं देता है अगर एक थ्रेड इसे संशोधित करने का प्रयास करता है जबकि दूसरा इसे चालू कर रहा है।

यह आलेख Java 7: HashMap vs ConcurrentHashMap एक बहुत अच्छा पढ़ा है। अत्यधिक सिफारिशित।

+3

तो 'हैशटेबल' और 'सिंक्रनाइज़ हैश मैप' के बीच क्या अंतर है? – roottraveller

+0

एक समवर्ती हैश मैप और एक सिंक्रनाइज़ हैश मैप के बीच, आप किसकी सिफारिश करते हैं? – Blunderchips

76

संक्षिप्त उत्तर:

दोनों नक्शे Map इंटरफ़ेस का धागा सुरक्षित कार्यान्वयन हैं। ConcurrentHashMap उन मामलों में उच्च थ्रूपुट के लिए लागू किया गया है जहां उच्च सहमति की अपेक्षा की जाती है।

ConcurrentHashMap के पीछे विचार पर ब्रायन गोएट्ज़ का article बहुत अच्छा पढ़ा गया है। अत्यधिक सिफारिशित।

+0

तब यह क्या है? HashMap: ध्यान दें कि यह कार्यान्वयन सिंक्रनाइज़ नहीं कर रहा है मानचित्र को आकस्मिक अनसिंक्रनाइज़्ड उपयोग रोकने के लिए: 'मानचित्र मीटर = Collections.synchronizedMap (नई HashMap (...));' http: // डॉक्स। oracle.com/javase/7/docs/api/java/util/HashMap.html – karate

+3

"ब्रायन गोएट्ज़ का लेख ... बहुत अच्छा पढ़ा गया है।" - और यहां तक ​​कि उनकी "जावा कंसुरेंसी इन प्रैक्टिस" पुस्तक भी है। –

24

ConcurrentHashMap पूरे मानचित्र को सिंक्रनाइज़ किए बिना थ्रेड सुरक्षित है। लॉक के साथ लिखते समय पढ़ना बहुत तेज़ हो सकता है।

5

ConcurrentHashMaplock stripping के रूप में ज्ञात फाइनर-ग्रेनेड लॉकिंग तंत्र का उपयोग करता है ताकि साझा की जाने वाली अधिक डिग्री की अनुमति मिल सके। इसके कारण यह बेहतर समवर्ती और स्केलेबिलिटी प्रदान करता है।

इसके अलावा ConcurrentHashMap के लिए लौट आए Iterators दुर्बलता से लगातार बजाय के तेजी से तकनीक समन्वयित HashMap द्वारा प्रयोग किया जाता असफल रहे हैं।

2

SynchronizedMap पर विधियों को ऑब्जेक्ट पर लॉक रखें, जबकि ConcurrentHashMap में "लॉक स्ट्रिपिंग" की एक अवधारणा है जहां ताले सामग्री के बाल्टी पर रखे जाते हैं। इस प्रकार स्केलेबिलिटी और प्रदर्शन में सुधार हुआ।

1

ConcurrentHashMap:

1) दोनों नक्शे मानचित्र इंटरफ़ेस का धागा सुरक्षित कार्यान्वयन हैं।

2) समवर्ती हैशैप उन मामलों में उच्च थ्रूपुट के लिए लागू किया गया है जहां उच्च सहमति की अपेक्षा की जाती है।

3) ऑब्जेक्ट स्तर में कोई लॉकिंग नहीं है।

समन्वयित हैश नक्शा:

1) प्रत्येक विधि एक वस्तु के स्तर का ताला का उपयोग कर समन्वयित है।

7

दोनों अपनी मूल कार्यक्षमता और उनकी आंतरिक संरचना में अंतर के साथ हैश मैप के सिंक्रनाइज़ संस्करण हैं।

ConcurrentHashMap आंतरिक सेगमेंट शामिल है जिसे स्वतंत्र हैशमैप्स के रूप में देखा जा सकता है। ऐसे सभी सेगमेंट को उच्च समवर्ती निष्पादन में अलग थ्रेड द्वारा लॉक किया जा सकता है। तो, एकाधिक थ्रेड एक दूसरे के लिए अवरुद्ध/प्रतीक्षा किए बिना ConcurrentHashMap से कुंजी-मूल्य जोड़े प्राप्त/रख सकते हैं। यह उच्च थ्रूपुट के लिए लागू किया गया है।

जबकि

Collections.synchronizedMap(), हम HashMap की एक सिंक्रनाइज़ संस्करण प्राप्त है और यह तरीके से रोकने में पहुँचा जा सकता है। इसका अर्थ यह है कि यदि एकाधिक थ्रेड एक ही समय में सिंक्रनाइज़ किए गए मैप तक पहुंचने का प्रयास करते हैं, तो उन्हें सिंक्रनाइज़ तरीके से एक समय में कुंजी-मूल्य जोड़े को प्राप्त/रखने की अनुमति होगी।

5

हम दोनों ConcurrentHashMap और सिंक्रनाइज़ हैशमैप का उपयोग कर थ्रेड सुरक्षा प्राप्त कर सकते हैं। लेकिन यदि आप उनके वास्तुकला को देखते हैं तो बहुत अंतर होता है।

  1. synchronisedHashmap

यह वस्तु स्तर पर ताला बनाए रखेगा। इसलिए यदि आप किसी भी ऑपरेशन को करना/प्राप्त करना चाहते हैं तो आपको पहले लॉक प्राप्त करना होगा। उसी समय, अन्य धागे को किसी भी ऑपरेशन करने की अनुमति नहीं है। तो एक समय में, केवल एक धागा इस पर काम कर सकता है। तो प्रतीक्षा समय यहां बढ़ेगा। हम कह सकते हैं कि जब आप ConcurrentHashMap की तुलना करते हैं तो प्रदर्शन अपेक्षाकृत कम होता है।

  1. ConcurrentHashMap

यह खंड स्तर पर ताला बनाए रखेगा। इसमें 16 खंड हैं और कुल मिलाकर 16 के रूप में समवर्ती स्तर को बनाए रखते हैं। तो एक समय में, 16 धागे ConcurrentHashMap पर काम करने में सक्षम हो सकते हैं। इसके अलावा, पढ़ना ऑपरेशन को लॉक की आवश्यकता नहीं है। तो किसी भी धागे पर एक ऑपरेशन कर सकते हैं।

thread1 खंड 2 और thread2 में डाल कार्रवाई करने के लिए चाहता है खंड 4 फिर इसे यहां की अनुमति दी है पर डाल कार्रवाई करने के लिए चाहता है। मतलब, 16 थ्रेड एक समय में ConcurrentHashMap पर अपडेट (डाल/हटाएं) ऑपरेशन कर सकते हैं।

ताकि प्रतीक्षा समय यहां कम होगा। इसलिए प्रदर्शन सिंक्रनाइज़ हैशमैप से अपेक्षाकृत बेहतर है।

0

ConcurrentHashMap आंकड़ों के समवर्ती उपयोग की अनुमति देता। पूरा नक्शा खंडों में बांटा गया है।

ऑपरेशन पढ़ें यानी। get(Object key) सेगमेंट स्तर पर भी सिंक्रनाइज़ नहीं किया गया है।

लेकिन ऑपरेशन लिखें यानी। remove(Object key), get(Object key) सेगमेंट स्तर पर लॉक प्राप्त करें। पूरे मानचित्र का केवल एक हिस्सा लॉक है, अन्य धागे अभी भी लॉक किए गए को छोड़कर विभिन्न सेगमेंट से मूल्य पढ़ सकते हैं।

सिंक्रनाइज़मैप दूसरी ओर, ऑब्जेक्ट स्तर पर लॉक प्राप्त करें। ऑपरेशन के बावजूद सभी धागे मौजूदा धागे की प्रतीक्षा करनी चाहिए (पढ़ें/लिखें)।

संबंधित मुद्दे