क्या स्थैतिक ConcurrentHashmap बाहरी सिंक्रनाइज़ेशन की जरूरत है-जावा, तुल्यकालन, ConcurrentHashmap

क्या स्थिर ConcurrentHashmap को सिंक्रनाइज़ ब्लॉक या ताले का उपयोग करके बाह्य रूप से सिंक्रनाइज़ करने की आवश्यकता है?

उत्तर:

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

यदि आपको संग्रह पर लॉक प्राप्त करने की आवश्यकता है तो आपको केवल बाहरी सिंक्रनाइज़ेशन की आवश्यकता है। संग्रह अपने आंतरिक ताले का पर्दाफाश नहीं करता है।

ConcurrentMap ने IFAbsent रखा है, हालांकि यदि ऑब्जेक्ट का निर्माण महंगा है तो आप इसका उपयोग नहीं करना चाहेंगे।

 final ConcurrentMap<Key, Value> map =

public Value get(Key key) {
// allow concurrent read
return map.get(key);
}

public Value getOrCreate(Key key) {
// could put an extra check here to avoid synchronization.
synchronized(map) {
Value val = map.get(key);
if (val == null)
map.put(key, val = new ExpensiveValue(key));
return val;
}
}

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

हां और ना। यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। ConcurrentHashMap अपने सभी तरीकों के लिए थ्रेड सुरक्षित है (उदा। प्राप्त करें और रखें)। हालांकि, यह है नहीं गैर-परमाणु संचालन के लिए धागा सुरक्षित। यहां एक उदाहरण है जो एक गैर-परमाणु संचालन करता है:

public class Foo {
Map<String, Object> map = new ConcurrentHashMap<String, Object>();

public Object getFoo(String bar) {
Object value = foo.get(bar);
if (value == null) {
value = new Object();
map.put(bar, foo);
}
return value;
}
}

यहां दोष यह है कि दो थ्रेड कॉलिंग के लिए यह संभव है getFoo एक अलग वस्तु प्राप्त करने के लिए। याद रखें कि किसी भी डेटा संरचना या प्रकार से निपटने के दौरान, जितना सरल हो int, गैर-परमाणु संचालन हमेशा बाहरी की आवश्यकता होती हैतुल्यकालन। परमाणु इंटेगर और ConcurrentHashMap जैसी कक्षाएं कुछ सामान्य संचालन थ्रेड को सुरक्षित बनाने में सहायता करती हैं, लेकिन चेक-अप-सेट ऑपरेशंस जैसे कि इन getFoo ऊपर।


जवाब के लिए 0 № 3

नहीं: बाहरी रूप से सिंक्रनाइज़ करने की कोई आवश्यकता नहीं है।

सभी विधियों पर java.util.concurrent कक्षाएं धागे सुरक्षित हैं।


जवाब के लिए 0 № 4

जहां तक ​​मुझे पता है कि इस कक्षा में सभी आवश्यक लॉकिंग की जाती है ताकि अगर आप कुछ विशिष्ट चीजें नहीं कर रहे हैं और इसे इस तरह काम करने की आवश्यकता है तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

पर http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html इसे कहते हैं:

हालांकि, हालांकि सभी परिचालन थ्रेड-सुरक्षित हैं, फिर भी पुनर्प्राप्ति संचालन लॉकिंग में शामिल नहीं होते हैं, और पूरी तालिका को इस तरह से लॉक करने के लिए कोई समर्थन नहीं है जो सभी पहुंच को रोकता है।

पुनर्प्राप्ति संचालन (प्राप्त करने सहित) आम तौर पर करते हैंब्लॉक न करें, इसलिए अपडेट ऑपरेशंस (डाल और निकालने सहित) के साथ ओवरलैप हो सकता है। पुनर्प्राप्ति उनके प्रारंभ होने पर हाल ही में किए गए नवीनतम अपडेट ऑपरेशन के परिणामों को दर्शाती है।

इसलिए यदि यह आपके विशिष्ट एप्लिकेशन में किसी भी समस्या का प्रतिनिधित्व नहीं करता है तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।


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