2012-12-04 28 views
23

निष्पादित करने के लिए लोगों का उल्लेख किया है की एक संख्या के रूप में और का सामना करना पड़ा HashMap.put एक अनंत निष्पादन पाश जब समवर्ती इस्तेमाल किया में जाने (GRIZZLY-1207, JGRP-525, संभवतः HHH-6414 देखते हैं, कर सकते हैं और इस अतः answer)।समय HashMap.put के कारण के बारे में बताएं() अनंत लूप

HashMap स्पष्ट रूप से थ्रेड सुरक्षित नहीं है। जाहिर है, सही फिक्स Map, ConncurrentHashMap विशेष रूप से थ्रेड-सुरक्षित कार्यान्वयन का उपयोग करना है। मैं समवर्ती समय के बारे में अधिक उत्सुक हूं जो अनंत लूप का कारण बनता है। मुझे हाल ही में जावा 7 जेआरई के साथ इस लूप का सामना करना पड़ा और सटीक कारणों को समझना चाहूंगा। उदाहरण के लिए, क्या यह एक ही समय में एकाधिक स्थानों के कारण होता है?

HashMap.put के अंदर एक नज़र से पता चलता है कि HashMap.Entry में अगले नोड (बाल्टी में) का एक लिंक शामिल है। मुझे लगता है कि ये लिंक सर्कुलर संदर्भों को भ्रष्ट करने के लिए भ्रष्ट हो रहे हैं, जो अनंत लूप का कारण बन रहा है। हालांकि, मैं अभी भी समझ में नहीं आता कि भ्रष्टाचार कैसे हो रहा है।

उत्तर

29

कई लोग क्या सोचते हैं की विपरीत करने के लिए, multi-threading और HashMaps साथ मुख्य मुद्दा सिर्फ एक डुप्लिकेट प्रविष्टि या एक एक गायब हो जाने नहीं है ... जैसा कि आपने कहा, अनंत लूप हो सकता है जब दो या दो से अधिक Threads समवर्ती का फैसला HashMap का आकार बदलें।

यदि हैश मैप का आकार किसी दिए गए थ्रेसहोल्ड को पास करता है, तो कई थ्रेड एक ही समय में इसका आकार बदलने का प्रयास कर सकते हैं, और यदि हम भाग्यशाली हैं (आपने पहले ही उत्पादन में कोड को तैनात किया है) तो वे हमेशा के लिए जा रहे रहेंगे। ..

समस्या void resize(int newCapacity); और void transfer(Entry[] newTable); के तरीके के कारण हुई है, तो आप openjdk source code स्वयं को देख सकते हैं। बुरी किस्मत, अच्छा समय, प्रविष्टियां जो उलटी हो जाती हैं (इस डेटा संरचना में ऑर्डरिंग की आवश्यकता नहीं होती है) और यह एक गलती से एक दूसरे का जिक्र करते हुए गलती से while(e != null) ...

जबकि मैं कोशिश कर सकता था आपको खुद को स्पष्टीकरण देने के लिए, मैं Paul Tyma की पोस्ट को क्रेडिट देना चाहता हूं (मैं वैसे भी उससे बेहतर नहीं कर सकता) जहां मैंने सीखा कि पहली बार मैंने यह पता लगाने का फैसला किया कि मुझे नौकरी के लिए किराए पर क्यों नहीं रखा गया हालत महीने पहले ...

http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html

पौलुस कहता है के रूप में, सबसे अच्छा शब्द इस दौड़ का वर्णन करने के लिए है: beautiful