2012-04-27 15 views
12

मेरे पास कैश आइटम है जिसमें कैश आइटम स्टोर करने के लिए volatile HashMap<T> है।अस्थिर हैश मैप बनाम ConcurrentHashMap

मुझे उत्सुकता है कि volatile HashMap को ConcurrentHashMap में बदलने का क्या परिणाम होगा?

क्या मुझे प्रदर्शन में वृद्धि होगी? यह कैश केवल कैश है।

उपयोग करने का सबसे अच्छा विकल्प क्या होगा? बस हैश मैप? एक अंतराल पर कैश आबादी जा रही है।

+3

यदि यह केवल पढ़ने के लिए आपको चाहिए ... न तो। 'हैश मैप' पर –

+4

'अस्थिर' का अर्थ है कि जब आप 'हैश मैप' ऑब्जेक्ट प्राप्त करते/सेट करते हैं तो आप मेमोरी बाधा पार करते हैं। जब आप मानचित्र से चीजों को जोड़ते या हटाते हैं तो यह कुछ भी नहीं करता है – Gray

+0

@BrianRoach आप क्या उपयोग करेंगे? – DarthVader

उत्तर

31

सबसे पहले, ऐसा प्रतीत होता है कि आपको समझ में नहीं आता कि volatile कीवर्ड क्या करता है। यह सुनिश्चित करता है कि संदर्भ मान परिवर्तनीय घोषित volatile परिवर्तनों द्वारा आयोजित किया गया है, तो अन्य धागे इसे कैश की गई प्रतिलिपि के बजाय देखेंगे। यह HashMap

तक पहुँचने कि यह देखते हुए के संबंध में धागे की सुरक्षा के साथ कोई लेना देना नहीं है, और वास्तव है कि आप कहते हैं कि HashMap है केवल पढ़ने के लिए ... आप निश्चित रूप से कुछ भी thread- प्रावधान है कि उपयोग करने के लिए की जरूरत नहीं है एक ConcurrentHashMap

जोड़ने के लिए संपादित सहित सुरक्षा: आपका अंतिम संपादन अब आप कहते हैं कि

है कि केवल पढ़ने के लिए नहीं तो "कैश एक अंतराल पर डाला जा रहा है", यह क्या है?

आप धागे से पढ़ने जबकि आप लिख रहे हैं (मौजूदा HashMap अद्यतन करना) के लिए तो आप एक ConcurrentHashMap का उपयोग करना चाहिए, हाँ जा रहे हैं।

यदि आप पूरी तरह से नया HashMap पॉप्युलेट कर रहे हैं तो मौजूदा चर को यह बताए, तो आप volatile

+0

अच्छी तरह से यही कारण है कि मैं अस्थिरता का उपयोग कर रहा था, फ़ाइल से एक पृष्ठभूमि थ्रेड पढ़ रहा था और फिर एक नया हैशप बना रहा था और फिर कैश को असाइन कर रहा था। मैं डिजाइन बदलने की योजना बना रहा हूं, यही कारण है कि मैंने पूछा। आपने हालांकि दोनों मामलों का जवाब दिया। धन्यवाद। – DarthVader

+0

वास्तव में आप यह सुनिश्चित करने के लिए 'अस्थिर' का उपयोग कर सकते हैं कि लोग सबसे वर्तमान तत्व देखें (मूल रूप से वही तरीका जो आप "अस्थिर" सरणी तत्व प्राप्त करने के लिए करते हैं), यह केवल एक है) खराब प्रदर्शन, बी) घुलनशील, सी) नहीं करता है डेटा जोड़ते समय आंतरिक दौड़ की स्थिति में मदद करें और डी) सादा बेवकूफ। लेकिन करने योग्य! ;) – Voo

+0

@Voo आप क्या उपयोग करेंगे? या आप इसे कैसे करेंगे? – DarthVader

6

का उपयोग आप कहते हैं कि कैश है केवल पढ़ने के लिए, लेकिन यह भी एक अंतराल जो विरोधाभासी लगता है पर अद्यतन किया जा रहा।

यदि पूरे कैश को अंतराल पर अपडेट किया जाता है, तो मैं अस्थिरता का उपयोग करता रहूंगा। अस्थिर सुनिश्चित करेगा कि अद्यतन नक्शा सुरक्षित रूप से प्रकाशित है।

public final class Cache 
{ 
    private volatile Map<?,?> cache; 

    private void mapUpdate() { 
     Map<?,?> newCache = new HashMap<>(); 

     // populate the map 

     // update the reference with an immutable collection 
     cache = Collections.unmodifiableMap(newCache); 
    } 
} 

अंतराल अद्यतन एक ही कैश को संशोधित किया गया है, तो आप शायद एक ConcurrentHashMap उपयोग करने के लिए, या नक्शे की प्रतिलिपि, प्रतिलिपि को अपडेट, और संदर्भ को अद्यतन करना चाहते हैं।

public final class Cache 
{ 
    private volatile Map<?,?> cache; 

    private void mapUpdate() { 
     Map<?,?> newCache = new HashMap<>(cache); 

     // update the map 

     // update the reference with an immutable collection 
     cache = Collections.unmodifiableMap(newCache); 
    } 
} 
+0

मैं कैश फ़ील्ड को अस्थिर रखने के लिए विचार करता हूं। संग्रह के कारण .unmodifiableMap अंतिम फ़ील्ड लिंक मानचित्र के नए संस्करण को सुरक्षित रूप से प्रकाशित किया जाएगा। किसी बिंदु पर सभी धागे कैश मैप के नए संस्करण को उठाएंगे। आम तौर पर (लेकिन हमेशा नहीं!) इससे कोई फर्क नहीं पड़ता कि कैश तुरंत उपलब्ध नहीं होगा लेकिन कुछ मिलीसेकंड में उपलब्ध होगा। और इस क्षेत्र को गैर-अस्थिर बनाना सीपीयू कैश प्रदर्शन को थोड़ा सा सुधारता है। – vlsergey

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