2011-09-10 12 views
8

मुझे यह कथन मिला कि यदि थ्रेड एक संग्रह को संशोधित करता है, तो यह एक असफल-तेज़ इटरेटर के साथ संग्रह पर फिर से चल रहा है, तो इटेटर इस अपवाद को फेंक देगा। http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html पर।पुनरावृत्ति के दौरान संग्रह में तत्व को संशोधित करने की अवधारणाएं?

मैंने पाया समवर्ती संशोधन भी कोड

List<Employee> lista= new ArrayList(); 
Employee emp1=new Employee(); 
Employee emp2=new Employee(); 
Employee emp3=new Employee(); 
lista.add(emp1); 
lista.add(emp2); 
lista.add(emp3); 
for(Employee emp:lista) 
{ 
emp2.setEmpId(2); 
lista.remove(emp2); 
} 

Question1 नीचे में फेंक दिया जाता है: - तो मैं कह सकता हूँ पाश के लिए बढ़ाने के भी असफल फास्ट इटरेटर का उपयोग करता है आंतरिक रूप से हालांकि जब मैं नीचे दिए गए कोड को अंजाम यह काम करता है? ठीक

for(int i=0;i<lista.size();i++) 
{ 
Employee empTemp=lista.get(i); 
lista.remove(emp2);   
} 

Question2: - एक और सवाल जब बयान कहना

है

एक धागा एक एक संग्रह

मेरा अनुमान संशोधन यहाँ सूची इंटरफेस के लिए संग्रह के अंदर हटाने या इसके लिए नहीं तत्व का अद्यतन मतलब है कि यह भी सेट इंटरफेस के लिए तत्व के संशोधन शामिल है, जबकि है को संशोधित करता है। सही? कम से कम जिन कार्यक्रमों की मैंने कोशिश की वह उनके साथ मामला है।

संपादित

के बारे में सेट मैं अपने ऊपर बयान पर शक यानी यह समवर्ती संशोधन अपवाद फेंकता है जब हम तैयार किया, जबकि iterating.I कोड के नीचे की कोशिश की संशोधित करने की कोशिश, लेकिन यह किसी भी अपवाद

HashSet<Employee> set1= new HashSet(); 
Employee emp4=new Employee(); 
Employee emp5=new Employee(); 
Employee emp6=new Employee(); 
set1.add(emp4); 
set1.add(emp5); 
set1.add(emp6); 


Iterator iter1=set1.iterator(); 
while(iter1.hasNext()) 
{ 
Employee emp12=(Employee)iter1.next(); 
System.out.println(""); 
emp5.setEmpId(2); 

} 
फेंक नहीं था

आदर्श रूप से प्रति बयान के अनुसार यदि सेटर को http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html पर बनाया गया है, तो इसे समवर्ती संशोधन अपवाद फेंकना चाहिए लेकिन ऐसा नहीं हुआ। यकीन नहीं है कि क्यों?

+1

प्रश्न 1 पर आपके उदाहरण के बारे में: "हालांकि जब मैं कोड के नीचे निष्पादित करता हूं तो यह ठीक काम करता है" आपका कोड ठीक नहीं है, यह बहुत बीमार है। यदि आप अनुक्रमित फॉर-लूप के भीतर तत्व जोड़ते/हटाते हैं तो आप कुछ तत्वों को छोड़ देंगे या अन्य तत्वों को दो बार संसाधित करेंगे। यह एक अच्छी बात है कि जब आप संग्रह को संशोधित करते हैं तो इटेटरेटर अपवाद फेंकता है। – toto2

उत्तर

11

Question1: -? तो पाश के लिए बढ़ाने के मैं कह सकता भी आंतरिक रूप से असफल फास्ट इटरेटर का उपयोग करता है हालांकि जब मैं नीचे दिए गए कोड को अंजाम यह ठीक काम करता है

हाँ, सही thats। यदि आप चाहें तो इसे सत्यापित करने के लिए javap कमांड के साथ संकलित कोड पर नज़र डालें।

मेरा अनुमान संशोधन यहाँ सूची इंटरफेस के लिए संग्रह के अंदर हटाने या इसके लिए नहीं तत्व को अद्यतन करने का मतलब है कि यह भी सेट इंटरफेस के लिए तत्व के संशोधन शामिल है, जबकि है। सही? कम से कम कार्यक्रम मैंने कोशिश की है कि यह उनके साथ मामला है।

Thats सही है, अगर आप emp1.setEmpId(2) या कुछ इसी तरह करते हैं, यात्रा असफल नहीं होंगे।

... इसे समवर्ती संशोधन अपवाद फेंकना चाहिए लेकिन ऐसा नहीं हुआ। यकीन नहीं है कि क्यों?

यह एकमात्र अपवाद फेंकता है तो आप सूची संशोधित । ध्यान रखें कि सूची में वस्तुओं के संदर्भ शामिल हैं। यदि आप ऑब्जेक्ट्स को संशोधित करते हैं, तो संदर्भ नहीं बदलते हैं, इस प्रकार सूची परिवर्तित नहीं होती है।

+0

हाय एयोबेब क्या आप संपादित भाग को भी देख सकते हैं? –

+0

मेरा जवाब स्पष्ट। – aioobe

2

जब तक कि यह दो अलग-अलग धागे तक पहुंच न हो, सूची में तत्वों को संशोधित करने में कोई खतरा नहीं है। आपका concurrent modification exception फेंक नहीं देता है क्योंकि आप सेट के तत्वों को संशोधित कर रहे हैं, सेट स्वयं ही नहीं।

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