आवरण वर्ग, का उपयोग कर के बीच अंतर क्या है SynchronizedMap
एक पर, HashMap
और ConcurrentHashMap
?
क्या केवल इसे HashMap
पुनरावृत्त करते समय इसे संशोधित किया जा सकता है ConcurrentHashMap
?
आवरण वर्ग, का उपयोग कर के बीच अंतर क्या है SynchronizedMap
एक पर, HashMap
और ConcurrentHashMap
?
क्या केवल इसे HashMap
पुनरावृत्त करते समय इसे संशोधित किया जा सकता है ConcurrentHashMap
?
जवाबों:
सिंक्रनाइज़ HashMap
:
ऑब्जेक्ट स्तर लॉक का उपयोग करके प्रत्येक विधि को सिंक्रनाइज़ किया जाता है। तो और synchMap पर तरीकों डाल एक ताला प्राप्त करते हैं।
पूरे संग्रह को लॉक करना एक प्रदर्शन ओवरहेड है। जबकि एक धागा ताला पर रखता है, कोई अन्य धागा संग्रह का उपयोग नहीं कर सकता है।
ConcurrentHashMap
JDK 5 में पेश किया गया था।
ऑब्जेक्ट स्तर पर कोई लॉकिंग नहीं है, लॉकिंग बहुत बारीक ग्रैन्युलैरिटी पर है। एक के लिए ConcurrentHashMap
, ताले हैशमैप बकेट स्तर पर हो सकते हैं।
निचले स्तर के लॉकिंग का प्रभाव यह है कि आपके पास समवर्ती पाठक और लेखक हो सकते हैं जो सिंक्रनाइज़ किए गए संग्रह के लिए संभव नहीं है। इससे बहुत अधिक स्केलेबिलिटी होती है।
ConcurrentHashMap
ConcurrentModificationException
यदि कोई एक धागा इसे संशोधित करने का प्रयास नहीं करता है, जबकि दूसरा उस पर पुनरावृत्ति करता है, तो उसे फेंकता नहीं है।
यह लेख जावा 7: हैशपॉज़ बनाम कॉनकंट्रैशहैशपेज़ बहुत अच्छा पढ़ा गया है। अत्यधिक सिफारिशित।
ConcurrentHashMap
की size()
परिणाम पुराना हो सकता है। size()
"Java Concurrency in Practice" पुस्तक के अनुसार सटीक गणना के बजाय एक सन्निकटन वापस करने की अनुमति है। इसलिए इस विधि का उपयोग सावधानी से किया जाना चाहिए।
संक्षिप्त उत्तर:
दोनों मानचित्र Map
इंटरफ़ेस के थ्रेड-सुरक्षित कार्यान्वयन हैं । ConcurrentHashMap
उन मामलों में उच्च थ्रूपुट के लिए लागू किया जाता है जहां उच्च संगामिति की उम्मीद है।
पीछे के विचार पर ब्रायन गोएत्ज़ का लेखConcurrentHashMap
बहुत अच्छा पढ़ा गया है। अत्यधिक सिफारिशित।
Map m = Collections.synchronizedMap(new HashMap(...));
अनियंत्रित
ConcurrentHashMap
पूरे नक्शे को सिंक्रनाइज़ किए बिना थ्रेड सुरक्षित है। रीड बहुत तेजी से हो सकता है जबकि लेखन लॉक के साथ किया जाता है।
हम समवर्ती HashMap और सिंक्रोनाइज़्ड Hashmap दोनों का उपयोग करके थ्रेड सुरक्षा प्राप्त कर सकते हैं। लेकिन अगर आप उनकी वास्तुकला को देखें तो बहुत अंतर है।
यह ऑब्जेक्ट स्तर पर लॉक बनाए रखेगा। इसलिए यदि आप पुट / गेट जैसे किसी भी ऑपरेशन को करना चाहते हैं तो आपको पहले लॉक का अधिग्रहण करना होगा। उसी समय, अन्य थ्रेड्स को किसी भी ऑपरेशन को करने की अनुमति नहीं है। इसलिए एक समय में, केवल एक धागा इस पर काम कर सकता है। इसलिए यहां वेटिंग टाइम बढ़ेगा। हम कह सकते हैं कि जब आप ConcurrentHashMap के साथ तुलना कर रहे हैं तो प्रदर्शन अपेक्षाकृत कम है।
यह खंड स्तर पर ताला बनाए रखेगा। इसके 16 खंड हैं और डिफ़ॉल्ट रूप से समवर्ती स्तर को 16 बनाए रखता है। तो एक समय में, 16 सूत्र समवर्ती HashMap पर संचालित करने में सक्षम हो सकते हैं। इसके अलावा, रीड ऑपरेशन को लॉक की आवश्यकता नहीं होती है। तो किसी भी संख्या में धागे उस पर एक ऑपरेशन कर सकते हैं।
अगर thread1 खंड 2 में पुट ऑपरेशन करना चाहता है और thread2 खंड 4 पर पुट ऑपरेशन करना चाहता है तो इसे यहाँ अनुमति है। मतलब, 16 धागे एक समय में समवर्ती हाशप पर अपडेट (पुट / डिलीट) ऑपरेशन कर सकते हैं।
ताकि यहां इंतजार का समय कम रहे। इसलिए प्रदर्शन सिंक्रोनाइज्ड हाशमैप से अपेक्षाकृत बेहतर है।
दोनों अपने मुख्य कार्यक्षमता और उनकी आंतरिक संरचना में अंतर के साथ, हाशप के सिंक्रनाइज़ संस्करण हैं।
ConcurrentHashMap आंतरिक खंडों से मिलकर बनता है जिसे स्वतंत्र रूप से HashMaps के रूप में देखा जा सकता है। ऐसे सभी खंडों को अलग-अलग धागे द्वारा उच्च समवर्ती निष्पादन में बंद किया जा सकता है। इसलिए, कई धागे एक दूसरे को अवरुद्ध / प्रतीक्षा किए बिना, समवर्ती हाशिए से कुंजी-मूल्य जोड़े प्राप्त कर सकते हैं। यह उच्च थ्रूपुट के लिए लागू किया गया है।
जहाँ तक
Collections.synchronizedMap () , हमें HashMap का एक सिंक्रनाइज़ संस्करण मिलता है और इसे अवरुद्ध तरीके से एक्सेस किया जाता है। इसका मतलब है कि अगर एक ही समय में कई थ्रेड्स सिंक्रोनाइज़ करने की कोशिश करते हैं, तो उन्हें कुंजी-वैल्यू जोड़े को एक बार में सिंक्रोनाइज़ करने के लिए अनुमति दी जाएगी।
ConcurrentHashMap
lock stripping
साझा पहुंच की अधिक से अधिक डिग्री की अनुमति देने के लिए महीन-दाने वाले लॉकिंग तंत्र का उपयोग करता है। इसके कारण यह बेहतर संगामिति और मापनीयता प्रदान करता है ।
इसके अलावा के लिए लौट आए iterators ConcurrentHashMap
हैं दुर्बलता से संगत के बजाय तेजी से तकनीक असफल समन्वयित HashMap द्वारा इस्तेमाल किया।
SynchronizedMap
ऑब्जेक्ट पर लॉक को होल्ड करने के तरीके , जबकि ConcurrentHashMap
"लॉक स्ट्रिपिंग" की एक अवधारणा है, जहां सामग्री के बकेट पर ताले लगे रहते हैं। इस प्रकार मापनीयता और प्रदर्शन में सुधार हुआ।
समवर्ती हाशिए:
1) दोनों मानचित्र मानचित्र इंटरफ़ेस के थ्रेड-सुरक्षित कार्यान्वयन हैं।
2) समवर्तीहैशपप उन मामलों में उच्च थ्रूपुट के लिए कार्यान्वित किया जाता है जहां उच्च संगामिति की उम्मीद की जाती है।
3) ऑब्जेक्ट स्तर में कोई लॉकिंग नहीं है।
सिंक्रनाइज़ हैश मैप:
1) प्रत्येक विधि एक ऑब्जेक्ट स्तर लॉक का उपयोग करके सिंक्रनाइज़ की जाती है।
ConcurrentHashMap डेटा के समवर्ती उपयोग की अनुमति देता है। पूरा नक्शा खंडों में विभाजित है।
पढ़ें ऑपरेशन यानी। get(Object key)
खंड स्तर पर भी सिंक्रनाइज़ नहीं है।
लेकिन संचालन लिखें। remove(Object key), get(Object key)
खंड स्तर पर ताला प्राप्त करें। पूरे नक्शे का केवल एक हिस्सा बंद है, अन्य धागे अभी भी विभिन्न खंडों के मूल्यों को पढ़ सकते हैं, केवल एक को छोड़कर।
दूसरी ओर सिंक्रोनाइज़्ड मैप, ऑब्जेक्ट स्तर पर लॉक का अधिग्रहण करता है। सभी थ्रेड्स को चालू थ्रेड के बावजूद इंतजार करना चाहिए (पढ़ें / लिखें)।
समवर्ती HashMap बनाम समवर्ती HashMap के लिए एक सरल प्रदर्शन परीक्षण
। परीक्षण प्रवाह बुला रहा हैput
एक थ्रेड में कॉल कर रहा है और समवर्ती get
पर तीन थ्रेड्स में कॉल कर रहा है Map
। जैसा कि @trshiv ने कहा, ConcurrentHashMap के पास लॉक के बिना रीडिंग ऑपरेशन के लिए उच्च प्रवाह और गति है। परिणाम तब होता है जब ऑपरेशन का समय समाप्त हो जाता है 10^7
, समवर्ती 2x
HashMap से समवर्ती HashMap तेजी से होता है।
SynchronizedMap
तथा ConcurrentHashMap
दोनों थ्रेड सेफ क्लास हैं और इन्हें मल्टीथ्रेड एप्लिकेशन में उपयोग किया जा सकता है, उनके बीच मुख्य अंतर यह है कि वे थ्रेड सुरक्षा कैसे प्राप्त करते हैं।
SynchronizedMap
पूरे मानचित्र उदाहरण पर लॉक प्राप्त करता है, जबकि ConcurrentHashMap
मानचित्र उदाहरण को कई खंडों में विभाजित करता है और उन पर लॉकिंग किया जाता है।
जैवा डॉक के अनुसार
हैशटेबल और कलेक्शंस। एसिंक्रोनाइज़्ड मैप (नया हैशपॉप ()) सिंक्रनाइज़ हैं। लेकिन ConcurrentHashMap "समवर्ती" है।
एक समवर्ती संग्रह थ्रेड-सुरक्षित है, लेकिन एकल बहिष्करण लॉक द्वारा शासित नहीं है।
ConcurrentHashMap के विशेष मामले में, यह सुरक्षित रूप से समवर्ती पठन की किसी भी संख्या के साथ-साथ समवर्ती लेखन की एक ट्यून करने योग्य संख्या की अनुमति देता है। "सिंक्रोनाइज्ड" कक्षाएं तब उपयोगी हो सकती हैं जब आपको गरीब स्केलेबिलिटी की कीमत पर एकल लॉक के माध्यम से एक संग्रह तक सभी पहुंच को रोकने की आवश्यकता होती है।
ऐसे अन्य मामलों में जिनमें एक सामान्य संग्रह तक पहुंचने के लिए कई थ्रेड्स की अपेक्षा की जाती है, "समवर्ती" संस्करण सामान्य रूप से बेहतर होते हैं। और बिना संग्रह के संग्रह किए जाने पर अनियंत्रित संग्रह बेहतर होते हैं या अन्य तालों को धारण करने पर ही सुलभ होते हैं।
Hashtable
और किसके बीच का अंतर हैSynchronized HashMap
?