2011-09-10 19 views
8

Encontré esta afirmación si un hilo modifica una colección directamente mientras itera sobre la colección con un iterador de fail-fast, el iterador aplicará esta excepción. al http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html.Conceptos de modificación del elemento en la colección durante la iteración?

me encontré con la modificación concurrente incluso arrojado por debajo de código

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); 
} 

Pregunta 1: - Entonces, ¿Puedo decir destaca por bucle también utiliza el iterador fail-fast internamente Aunque cuando yo haga a continuación código funciona? bien

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

pregunta 2: - Otra cuestión es cuando comunicado decir

si un hilo modifica un una colección

Mi conjetura es que la modificación significa aquí la eliminación o adición no para la actualización del elemento dentro de la colección para la interfaz de la lista, mientras que también incluye la modificación del elemento de la interfaz conjunto. ¿Derecha? Al menos los programas que probé es el caso con ellos.

Editar

conjunto Respecto dudo que mi afirmación anterior es decir, se genera una excepción modificación concurrente cuando tratamos de modificar SET mientras iterating.I trató a continuación código pero no lanzó ninguna excepción

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); 

} 

Idealmente, según el enunciado si el conjunto se modifica en cualquier momento después de que se crea el iterador en http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html, debe arrojar la excepción de modificación concurrente, pero no fue así. No estoy seguro por qué?

+1

Acerca de su ejemplo en la Pregunta 1: "Aunque cuando ejecuto el código a continuación funciona bien" Su código no está bien, está muy enfermo. Si agrega/elimina elementos dentro de un bucle forzado indexado, omitirá algunos elementos o procesará otros elementos dos veces. Es bastante bueno que el iterador arroje una excepción cuando modifica una colección. – toto2

Respuesta

11

Pregunta 1 - ¿Así que puedo decir que se destaca por bucle también utiliza el iterador fail-fast internamente Aunque cuando yo haga a continuación el código que funciona bien

Sí, eso es correcto. Eche un vistazo al código compilado, con el comando javap para verificar esto si lo desea.

Mi conjetura es que la modificación significa aquí la eliminación o adición no para updation del elemento dentro de la colección para la interfaz de la lista, mientras que también incluye la modificación del elemento de la interfaz conjunto. ¿Derecha? Al menos los programas que probé es el caso con ellos.

Esa es la derecha, si lo hace emp1.setEmpId(2) o algo similar, la iteración no fallar.

... debe emitir la excepción modificación concurrente pero no fue así. No estoy seguro por qué?

Sólo se produce la excepción si modifica la lista . Tenga en cuenta que la lista contiene referencias a objetos. Si modifica los objetos, las referencias no cambian, por lo tanto, la lista no cambia.

+0

Hola aioobe, ¿puedes echar un vistazo a la parte editada también? –

+0

Aclaró mi respuesta. – aioobe

2

A menos que se acceda por dos hilos diferentes, no hay peligro al modificar los elementos dentro de la lista. su para no arroja concurrent modification exception porque está modificando los elementos del conjunto, no el conjunto en sí.

Cuestiones relacionadas