9

से विशिष्ट आइटम निकालें निकालें() विधि ठीक है? मैंने एक लेख पढ़ा है कि सिंक्रनाइज़ेशन को हटाने विधि में जोड़ा नहीं गया है। मैं ConcurrentHashMap से विशिष्ट आइटम को ठीक से कैसे हटा सकता हूं?जावा ConcurrentHashMap

उदाहरण कोड:

ConcurrentHashMap<String,Integer> storage = new ConcurrentHashMap<String,Integer>(); 
    storage.put("First", 1); 
    storage.put("Second", 2); 
    storage.put("Third",3); 


    //Is this the proper way of removing a specific item from a tread-safe collection? 
    storage.remove("First"); 

    for (Entry<String, Integer> entry : storage.entrySet()) { 
     String key = entry.getKey(); 
     Object value = entry.getValue(); 
     // ... 
     System.out.println(key + " " + value); 
    } 
+0

"मैं एक लेख है कि तुल्यकालन निकालें विधि को जोड़ा नहीं किया गया है पढ़ा है" था वह लेख जावा 5,6,7, या 8 के समय के बारे में लिखा गया है? शायद यह एक पुराने जावा संस्करण के साथ दिमाग में लिखा गया था। –

+0

उम्मीद है कि यह लिंक http://javarevisited.blogspot.ca/2013/02/concurrenthashmap-in-java-example-tutorial-working.html पर काम करता है। वह कहता है "चूंकि अद्यतन ऑपरेशन जैसे कि(), हटाएं(), putAll() या clear() सिंक्रनाइज़ नहीं किया गया है और पढ़ें: http://javarevisited.blogspot.com/2013/02/concurrenthashmap-in-java- उदाहरण-ट्यूटोरियल-working.html # ixzz3OM79B2ol " –

+0

@ पीटर.petrov - एक ConcurrentHashMap पर निकाली विधि को कॉल करना जैसे मैंने अपने कोड उदाहरण में किया है ठीक है, सही? थ्रेड-सुरक्षा कोई मुद्दा नहीं होना चाहिए? –

उत्तर

1

remove विधि एक ताला पर सिंक्रनाइज़ करता है।

public V remove(Object key) { 
    int hash = hash(key.hashCode()); 
    return segmentFor(hash).remove(key, hash, null); 
} 

जहां ConcurrentHashMap.Segment#remove(key, hash, null) के रूप में परिभाषित किया गया है:

V remove(Object key, int hash, Object value) { 
    lock(); 
    try { 
     ... 

नोट Javadoc विवरण:

दरअसल ConcurrentHashMap#remove() के कोड की जाँच, वहाँ एक lock विधि के लिए एक कॉल कि ताला प्राप्त है

पुनर्प्राप्ति संचालन (get सहित) आम तौर पर ब्लॉक नहीं करते हैं, इसलिए अद्यतन संचालन के साथ ओवरलैप हो सकता है (सहितऔर remove)। पुनर्प्राप्ति हाल ही में के परिणाम अद्यतन संचालन के परिणाम को प्रतिबिंबित करते हैं। putAll और clear जैसे कुल संचालन के लिए, समवर्ती पुनर्प्राप्ति केवल कुछ प्रविष्टियों को सम्मिलित या हटाने को प्रतिबिंबित कर सकती है। इसी तरह, इटरेटर और गणनाएं इशारा/गणना के निर्माण के बाद या किसी बिंदु पर हैश तालिका की स्थिति को प्रतिबिंबित करने वाले तत्व लौटती हैं। वे ConcurrentModificationException फेंकते हैं। हालांकि, इटेटर को एक समय में केवल एक धागे द्वारा उपयोग करने के लिए डिज़ाइन किया गया है।

+0

मेरे कोड उदाहरण में उपयोग की गई निकाली विधि ठीक है, है ना? मुझे थ्रेड-सुरक्षा के बारे में चिंता करने की ज़रूरत नहीं है? –

+1

हाँ यह ठीक है। यह थ्रेड-सुरक्षित है कि इसका उपयोग करने के लिए कोई लॉकिंग की आवश्यकता नहीं है और कोई 'ConcurrentModificationException' नहीं होगा। – manouti

+0

@ मनुती- धन्यवाद, आप रॉक करते हैं, मैंने लेख को लिंक किया है, मुझे अपनी जानकारी मिली है। मुझे लगता है कि लेखक गलत है। –

0

एक Iterator काम करना चाहिए:

Iterator<Map.Entry<String, Integer>> iterator = storage.entrySet().iterator(); 
while(iterator.hasNext()) 
{ 
    Map.Entry<String, Integer> entry = iterator.next(); 
    if(entry.getKey().equals("First")) 
    { 
     iterator.remove(); 
    } 
} 

संदर्भ: https://dzone.com/articles/removing-entries-hashmap

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