समवर्ती HashMap बनाम समकालिक HashMap


148

आवरण वर्ग, का उपयोग कर के बीच अंतर क्या है SynchronizedMapएक पर, HashMapऔर ConcurrentHashMap?

क्या केवल इसे HashMapपुनरावृत्त करते समय इसे संशोधित किया जा सकता है ConcurrentHashMap?

जवाबों:


120

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

  1. ऑब्जेक्ट स्तर लॉक का उपयोग करके प्रत्येक विधि को सिंक्रनाइज़ किया जाता है। तो और synchMap पर तरीकों डाल एक ताला प्राप्त करते हैं।

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

ConcurrentHashMap JDK 5 में पेश किया गया था।

  1. ऑब्जेक्ट स्तर पर कोई लॉकिंग नहीं है, लॉकिंग बहुत बारीक ग्रैन्युलैरिटी पर है। एक के लिए ConcurrentHashMap, ताले हैशमैप बकेट स्तर पर हो सकते हैं।

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

  3. ConcurrentHashMapConcurrentModificationExceptionयदि कोई एक धागा इसे संशोधित करने का प्रयास नहीं करता है, जबकि दूसरा उस पर पुनरावृत्ति करता है, तो उसे फेंकता नहीं है।

यह लेख जावा 7: हैशपॉज़ बनाम कॉनकंट्रैशहैशपेज़ बहुत अच्छा पढ़ा गया है। अत्यधिक सिफारिशित।


7
तो क्या Hashtableऔर किसके बीच का अंतर है Synchronized HashMap?
रोटरवेलर

1
एक समवर्ती हाशप और एक सिन्क्रोनस हाशप के बीच, आप किसे सलाह देते हैं?
Blunderchips

2
इसके लायक उल्लेख नहीं है कि है ConcurrentHashMapकी size()परिणाम पुराना हो सकता है। size()"Java Concurrency in Practice" पुस्तक के अनुसार सटीक गणना के बजाय एक सन्निकटन वापस करने की अनुमति है। इसलिए इस विधि का उपयोग सावधानी से किया जाना चाहिए।
एंड्री लिसुन

1
Hashtable और समन्वयित HashMap के लिए @roottraveller stackoverflow.com/questions/8875680/...
नरेंद्र जग्गी

89

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

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

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


1
फिर ये क्या है? HashMap: ध्यान दें कि यह कार्यान्वयन नक्शे पर आकस्मिक Map m = Collections.synchronizedMap(new HashMap(...)); अनियंत्रित
X-Huy

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

31

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


18

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

  1. synchronisedHashmap

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

  1. ConcurrentHashMap

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

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

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


बहुत अच्छी व्याख्या बहुत बहुत धन्यवाद
amoljdv06

11

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

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

जहाँ तक

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


7

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

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


3

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


2

समवर्ती हाशिए:

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

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

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

सिंक्रनाइज़ हैश मैप:

1) प्रत्येक विधि एक ऑब्जेक्ट स्तर लॉक का उपयोग करके सिंक्रनाइज़ की जाती है।


1

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

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

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

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


1

समवर्ती HashMap बनाम समवर्ती HashMap के लिए एक सरल प्रदर्शन परीक्षण । परीक्षण प्रवाह बुला रहा हैput एक थ्रेड में कॉल कर रहा है और समवर्ती getपर तीन थ्रेड्स में कॉल कर रहा है Map। जैसा कि @trshiv ने कहा, ConcurrentHashMap के पास लॉक के बिना रीडिंग ऑपरेशन के लिए उच्च प्रवाह और गति है। परिणाम तब होता है जब ऑपरेशन का समय समाप्त हो जाता है 10^7, समवर्ती 2xHashMap से समवर्ती HashMap तेजी से होता है।


1

SynchronizedMap तथा ConcurrentHashMap दोनों थ्रेड सेफ क्लास हैं और इन्हें मल्टीथ्रेड एप्लिकेशन में उपयोग किया जा सकता है, उनके बीच मुख्य अंतर यह है कि वे थ्रेड सुरक्षा कैसे प्राप्त करते हैं।

SynchronizedMapपूरे मानचित्र उदाहरण पर लॉक प्राप्त करता है, जबकि ConcurrentHashMapमानचित्र उदाहरण को कई खंडों में विभाजित करता है और उन पर लॉकिंग किया जाता है।

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


0

जैवा डॉक के अनुसार

हैशटेबल और कलेक्शंस। एसिंक्रोनाइज़्ड मैप (नया हैशपॉप ()) सिंक्रनाइज़ हैं। लेकिन ConcurrentHashMap "समवर्ती" है।

एक समवर्ती संग्रह थ्रेड-सुरक्षित है, लेकिन एकल बहिष्करण लॉक द्वारा शासित नहीं है।

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

ऐसे अन्य मामलों में जिनमें एक सामान्य संग्रह तक पहुंचने के लिए कई थ्रेड्स की अपेक्षा की जाती है, "समवर्ती" संस्करण सामान्य रूप से बेहतर होते हैं। और बिना संग्रह के संग्रह किए जाने पर अनियंत्रित संग्रह बेहतर होते हैं या अन्य तालों को धारण करने पर ही सुलभ होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.