E 'l'iterazione sulla cassaforte Vector da ConcurrentModificationException?
SI rende l'iterare su Vector salvo da ConcurrentModificationException
.If non è sincronizzato in quel caso, se si accede il vettore tramite vari fili e qualche altro thread è strutturalmente modificando il vettore in qualsiasi dopo che l'iteratore è stato creato, l'iteratore genererà ConcurrentModificationException
. Considerare l'esecuzione di questo codice:
import java.util.*;
class VVector
{
static Vector<Integer> mapItems = new Vector<Integer>();
static
{
for (int i = 0 ; i < 200 ; i++)
{
mapItems.add(i);
}
}
public static void readVector()
{
Iterator<Integer> iterator = mapItems.iterator();
try
{
while(iterator.hasNext())
{
System.out.print(iterator.next() + "\t");
}
}
catch (Exception ex){ex.printStackTrace();System.exit(0);}
}
public static void main(String[] args)
{
VVector v = new VVector();
Thread th = new Thread(new Runnable()
{
public void run()
{
int counter = 0;
while (true)
{
mapItems.add(345);
counter++;
if (counter == 100)
{
break;
}
}
}
});
th.start();
v.readVector();
}
}
A mio sistema sta mostrando seguente output, mentre l'esecuzione:
0 1 2 3 4 5 6 7 8 9
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at VVector.readVector(VVector.java:19)
at VVector.main(VVector.java:38)
Ma d'altra parte se si effettua il blocco di codice contenente Iterator
ad accedere a tale Vector
sincronizzato utilizzando mapItems
come blocco, impedirà l'esecuzione di altri metodi relativi a Vector
finché il blocco synchronized
non viene completato in modo atomico.
fonte
2013-03-15 18:19:35
hai qualche risposta corretta da accettare ?? – AmitG