2013-03-15 6 views
14

मिल रहा है मैं बहु-थ्रेडेड वातावरण में एक सूची सुरक्षित करने के लिए ArrayList के बजाय Vector का उपयोग कर रहा हूं। लेकिन जब मैं इसे Vector में आइटम जोड़ने की कोशिश करता हूं तो मैं ConcurrentModificationException प्राप्त करता रहता हूं। वह क्यों है और मैं इसे कैसे रोक सकता हूं?मैंने सिंक्रनाइज़ सूची का उपयोग किया, और मुझे अभी भी ConcurrentModificationException

+1

समवर्ती! = समांतर। आप एक थ्रेड के साथ एक ConcurrentModificationException प्राप्त कर सकते हैं। –

उत्तर

9

आप इसे फिर से सक्रिय करते समय वेक्टर को संशोधित नहीं कर सकते हैं। आइटम्स को एक अलग वेक्टर में जोड़ने के लिए स्टोर करें, और उन्हें वेक्टर में ले जाएं जब लूप समाप्त हो या मूल वेक्टर की एक प्रतिलिपि पर लूप हो।

जोड़ा: जावा में वेक्टर के चारों ओर एक म्युटेक्स पाने के लिए, दोनों कार्यों में ऐसा करते हैं:

synchronized (list) { 
    // modifying list 
} 

और:

synchronized (list) { 
    // iterating over list 
} 
बेशक

मैं मान लिया है कि सूची में नाम है list

+3

साइड नोट: यह सिंगल-थ्रेडेड प्रोग्राम्स में भी सच है। – svckr

+0

आप इतने सही हैं – fredrik

+0

आपका क्या मतलब है कि यह सिंगल-थ्रेडेड प्रोग्राम्स में सच है? – Shelef

2

यदि आप आइटम को पुन: जोड़ना चाहते हैं, तो आप ListIterator का उपयोग करना चाहेंगे। Vector का उपयोग करके, आप इस नियम को बाईपास नहीं कर रहे हैं (स्पष्ट रूप से), इसलिए मैं इसके बजाय ArrayList का उपयोग करने की अनुशंसा करता हूं।

+0

मुझे नहीं लगता कि एक से अधिक धागे शामिल होने पर ListIterator के साथ पुनरावृत्ति करते समय जोड़ना सुरक्षित है। – assylias

+1

@ वासिलियास, मैंने सवाल गलत समझा, मुझे लगता है। मैं बस 'ConcurrentModificationException' को संबोधित कर रहा था। – mre

0

यदि आपको अपनी सूची में पुनरावृत्ति करने और एक साथ जोड़ने की आवश्यकता है, तो आपको CopyOnWriteArrayList जैसी समवर्ती सूची का उपयोग करना चाहिए। ध्यान दें कि यदि आप सूची में बहुत कुछ लिखते हैं तो यह बहुत ही कुशल नहीं होगा।

अन्यथा, यदि आप वेक्टर या सिंक्रनाइज़लिस्ट का उपयोग करते हैं, तो आपको पुनरावृत्ति के दौरान सूची के लॉक को पकड़ने की आवश्यकता है। यह अपवाद को रोक देगा लेकिन यह समवर्तीता को भी रोक देगा ...

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