2012-05-14 15 views
7

ताला लगा मैंने कहीं पढ़ा है कि ConcurrentHashMap में, पूरे नक्शे वस्तु अवरोधित नहीं है और बजाय एक ताला मानचित्र के एक हिस्से पर किया जाता है।ConcurrentHashMap

क्या कोई तस्वीर में आने पर लॉकिंग कर सकता है?

यह सही मानचित्र पढ़ते समय कोई ताला इसमें शामिल है कि है, लेकिन अपडेट करते समय यह केवल ताला प्रयोग किया जाता है?

+3

इस आलेख में सहायता चाहिए: http://www.ibm.com/developerworks/java/library/j-jtp08223/ – yegor256

+1

[javadoc] (http://docs.oracle.com/javase/7/docs/ एपीआई/जावा/उपयोग/समवर्ती/ConcurrentHashMap.html) कार्यान्वयन की व्याख्या में काफी विस्तृत है। – trutheality

उत्तर

12

हाँ, ConcurrentHashMap ताले की एक भीड़ का उपयोग करता है, प्रत्येक ताला हैश के एक खंड नियंत्रित करता है।

किसी विशेष सेगमेंट में डेटा सेट करते समय, उस सेगमेंट के लिए लॉक प्राप्त होता है।

डेटा प्राप्त करते समय, एक अस्थिर पढ़ने का उपयोग किया जाता है। यदि अस्थिर पढ़ने के परिणामस्वरूप मिस में परिणाम होता है, तो सफल पढ़ने के अंतिम प्रयास के लिए सेगमेंट के लिए लॉक प्राप्त किया जाता है।

+1

मुझे नहीं मिला "अगर अगर अस्थिर पढ़ने के परिणामस्वरूप मिस में परिणाम होता है, तो खंड के लिए लॉक सफल पढ़ने के आखिरी प्रयास के लिए प्राप्त किया जाता है"। क्या आप विवरण में थोड़ा सा समझा सकते हैं? – Anand

+1

@anand जेएमएम के अनुसार यह संभव है कि ऑब्जेक्ट निर्माण समाप्त होने के बाद कन्स्ट्रक्टर में किसी क्षेत्र का अस्थिर लेखन धागे के लिए दृश्यमान हो और अन्य धागे के लिए दृश्यमान हो (यह अंतिम फ़ील्ड के लिए सही नहीं है)। वह लॉक जिसे वह संदर्भित करता है, यह सुनिश्चित करेगा कि उस अस्थिर लेखन wrt अन्य पढ़ने के आदेश से पहले होता है। नोट: यह ऐसा करने में सक्षम था, हालांकि कभी नहीं हो सकता है और मैंने जावा 6 में कभी पढ़ा नहीं है - सभी भ्रम की वजह से इसे हटाने की बात थी। –

+2

और स्पष्ट कन्स्ट्रक्टर पूरा करने के लिए बाल्टी के प्रवेश को संदर्भित करता है। –

5

लॉकिंग जितना संभव हो उतना छोटा हो गया है जबकि अभी भी थ्रेड-सुरक्षित है।

"नक्शा का हिस्सा लॉक है" को समझाने के लिए, इसका मतलब यह है कि अद्यतन करते समय, मानचित्र के केवल "1/concurrencyLevel" (कुंजी के हैश पर आधारित) लॉक हो जाता है। इसका अर्थ यह है कि यदि दो अलग-अलग "बाल्टी" को प्रभावित करते हैं, तो दो अपडेट अभी भी सुरक्षित रूप से निष्पादित कर सकते हैं, इस प्रकार लॉक विवाद को कम कर सकते हैं और प्रदर्शन को अधिकतम कर सकते हैं।

इससे भी महत्वपूर्ण बात, पर भरोसा JDK कार्यान्वयन - आप JDK में कार्यान्वयन विवरण (एक बात के लिए, इसे जारी करने की रिलीज से बदल सकते हैं) के बारे में चिंता करने की ज़रूरत नहीं होना चाहिए। इसके बजाय, बस पर अपने कोड लिखने पर ध्यान केंद्रित करें।

+0

जब आप हैशटेबल को लिंक करते हैं तो क्या आपका मतलब ConcurrentHashMap है। आपकी व्याख्या अन्यथा गलत है। संपूर्ण हैशटेबल उदाहरण किसी भी संशोधन या पढ़ने के लिए सिंक्रनाइज़ किया गया है। –

+0

@ जॉन विंट धन्यवाद। मैंने अपना जवाब अपडेट किया। – Bohemian

+0

@trutheality धन्यवाद। मैंने अपना जवाब सही किया। – Bohemian

0

ConcurrentHashMap पुनर्विक्रेता लॉक तंत्र का उपयोग करें। ConcurrentHashMap बाल्टी के बजाय सेगमेंट का उपयोग करता है और जब नया रिकॉर्ड डालने वाला लॉक केवल सेगमेंट की पूरी सूची नहीं सेगमेंट पर अधिग्रहण करेगा। तो यहां विचार यह स्पष्ट करता है कि मल्टी लेवल लॉक उसी पर अधिग्रहण करेगा।

कोई संगामिति स्तर explictity स्थापित किया गया है के रूप में, ConcurrentHashMap 16 खंडों में विभाजित हो जाता है। और प्रत्येक सेगमेंट एक स्वतंत्र हैश मैप के रूप में कार्य करता है।

ConcurrentHashMap में पढ़ने के ऑपरेशन पर कोई लॉक लागू नहीं है।

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

  • कोई संबंधित समस्या नहीं^_^