2012-04-25 14 views
7

समवर्ती हैशमैप सिंक्रनाइज़ेशन समस्या को हल कर सकता है जो हैशपैप में देखा जाता है। तो अगर हम हैशप के साथ सिंक्रनाइज़ कुंजी काम का उपयोग कर रहे हैं तो जोड़ना और निकालना तेज होगा। हैशपैप आकार की जांच करने के बारे में क्या, अगर मल्टीप्लेट थ्रेड समवर्ती हैशैप आकार की जांच कर रहा है? इस प्रकार कुछ: हम अभी भी synchronzation कुंजी शब्द की क्या ज़रूरत हैसमवर्ती हैश मैप: चेकिंग आकार

public static synchronized getSize(){ 
    return aConcurrentHashmap.size(); 
} 

उत्तर

8

concurentHashMap.size() कॉल के पल में ज्ञात आकार वापस कर देगा, लेकिन जब आप उस नंबर का उपयोग करते हैं तो यह एक पुराना मूल्य हो सकता है क्योंकि इस दौरान किसी अन्य थ्रेड ने आइटम को जोड़ा/हटा दिया है।

हालांकि ConcurrentMaps का पूरा उद्देश्य यह है कि आपको इसे सिंक्रनाइज़ करने की आवश्यकता नहीं है क्योंकि यह एक थ्रेड सुरक्षित संग्रह है।

1

तुम बहुत दुर्लभ अवसरों जहां atomically कई कार्रवाई करने की जरूरत है सिवाय ConcurretnHashMap के साथ सिंक्रनाइज़ उपयोग करने की आवश्यकता नहीं है।

बस आकार प्राप्त करने के लिए, आप सिंक्रनाइज़ेशन के बिना इसे कॉल कर सकते हैं।


स्पष्ट करने के लिए जब मैं ConcurrentHashMap के साथ तुल्यकालन का प्रयोग करेंगे ...

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

public ExpensiveObject get(String key) { 
    return map.get(key); // can work concurrently. 
} 

public void put(String key, ExepensiveBuilder builder) { 
    // cannot use putIfAbsent because it needs the object before checking. 
    synchronized(map) { 
     if (!map.containsKey(key)) 
      map.put(key, builder.create()); 
    } 
} 

नोट: यह आवश्यक है कि सभी राईट सिंक्रनाइज़ किए जाते हैं, लेकिन अभी भी पढ़ता समवर्ती हो सकता है।

+0

ConcurrentHashMap आंतरिक रूप से सिंक्रनाइज़ किया गया है। शीर्ष पर अपने स्वयं के सिंक्रनाइज़ ब्लॉक जोड़ना आपको वह नहीं दे सकता है जो आप चाहते हैं। – krock

+0

@krock आपको सावधान रहना होगा कि आप इसका उपयोग कैसे करते हैं। एक उदाहरण जोड़ना –

2

आप बस aConcurrentHashmap.size() पर कॉल कर सकते हैं। हालांकि, आपको यह ध्यान में रखना होगा कि जब तक आप उत्तर प्राप्त करेंगे तब तक यह पहले से ही अप्रचलित हो सकता है। यह तब होगा जब एक और धागा नक्शा समवर्ती रूप से संशोधित करे। तरीकों जो isEmpty() या size() की तरह पूरा HashMap पर काम खत्म हो गया get(), put() और remove():

0

ConcurrentHashMap के डिजाइनर की तरह अलग-अलग कार्यों के लिए महत्व देने के बारे में सोचा। ऐसा इसलिए किया जाता है क्योंकि इन विधियों के परिवर्तन (सामान्य रूप से) अन्य व्यक्तिगत तरीकों से कम होते हैं।

size() के लिए एक सिंक्रनाइज़ेशन की आवश्यकता नहीं है। हम concurentHashMap.size() विधि को कॉल करके आकार प्राप्त कर सकते हैं। यह विधि पुराने मूल्यों को वापस कर सकती है क्योंकि अन्य धागे इस दौरान मानचित्र को संशोधित कर सकते हैं। लेकिन, यह स्पष्ट रूप से टूटा हुआ माना जाता है क्योंकि इन परिचालनों को वंचित कर दिया गया है।

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