ConcurrentHashMap इस्तेमाल करें। यह पूरे map की जगह हर bin पर lock लगाता है, खाली bins के लिए compare and set और बाकी में bin head पर synchronize करते हुए, इसलिए readers कभी ब्लॉक नहीं होते और अलग अलग bins में लिखने वाले साथ साथ चलते हैं। synchronized map हर operation को एक ही lock पर कतार में लगा देता है, और iterate करते वक्त भी उसे बाहरी synchronization चाहिए। get के बाद put करने की जगह इसके atomic methods, जैसे compute और merge, इस्तेमाल करें।
इंटरव्यूअर यह क्यों पूछते हैं
यह जांचता है कि आप जानते हैं कि concurrent collections क्यों बनीं, या आदतन synchronized की तरफ हाथ बढ़ा देते हैं। इंटरव्यूअर granularity का फर्क सुनना चाहते हैं और वह अहम व्यावहारिक बात कि map को लपेट देने से operations के सिलसिले atomic नहीं हो जाते। यह जानना कि size और iteration weakly consistent हैं, और CopyOnWriteArrayList या BlockingQueue कब बेहतर औजार है, जवाब को पूरा कर देता है।
अपना जवाब कैसे स्ट्रक्चर करें
- पहले औजार का नाम लें, फिर वह तरीका जो इसे तेज बनाता है।
- समझाएं कि compound actions के लिए synchronized wrapper फिर भी काफी क्यों नहीं।
- read modify write के लिए atomic methods की ओर इशारा करें।
- बाकी concurrent collections और वे कब फिट बैठती हैं, इसका जिक्र करें।
उदाहरण जवाब
ConcurrentHashMap, लगभग हमेशा। असली फर्क granularity का है: यह एक अकेले bin के स्तर पर lock लगाता है, और खाली bin में insert तो बस एक compare and set है, तो असंबंधित keys आपस में नहीं टकरातीं और reads lock free रहती हैं। synchronized map सब कुछ के चारों ओर एक lock लगा देता है, तो जैसे ही कुछ थ्रेड्स व्यस्त होते हैं वही अड़चन बन जाता है। synchronized wrapper के साथ बड़ा जाल यह है कि अलग अलग calls atomic हैं पर उनका सिलसिला नहीं, तो अगर मैं containsKey जांचूं और फिर put करूं, कोई और थ्रेड बीच में घुस सकता है, और खुद lock पकड़े बिना iteration तो बिल्कुल सुरक्षित नहीं है। इसीलिए मैं atomic methods इस्तेमाल करता हूं: lazily बनने वाली cache entry के लिए computeIfAbsent, counters के लिए merge, ताकि read modify write map के भीतर ही हो। जानने लायक बातें ये हैं कि कनकरेंट बदलाव के दौरान size एक अनुमान है और iterators weakly consistent हैं, तो वे exception नहीं फेंकते पर सबसे नई writes शायद न देखें। दूसरी शक्लों के लिए मैं CopyOnWriteArrayList तब लेता हूं जब reads writes से कहीं ज्यादा हों, और producer तथा consumer के बीच अदला बदली के लिए BlockingQueue।
जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।
देखें यह कैसे काम करता हैफॉलो-अप सवाल जिनकी उम्मीद रखें
- computeIfAbsent के अंदर भारी काम करने के क्या खतरे हैं?
- weakly consistent iteration का व्यवहार में क्या मतलब है?
- CopyOnWriteArrayList कब गलत चुनाव है?
Java डेवलपर के और सवाल
आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।
मेरे सवाल प्रेडिक्ट करें