Это делает итерацию над безопасным вектором с ConcurrentModificationException?
ДА Это делает Перебор Вектор безопасности от ConcurrentModificationException
.Если он не синхронизирован, то в том случае, если вы обращаетесь к Vector с помощью различных нитей и некоторые другие темы конструктивно изменяя вектор в любой время после создания итератора, итератор будет бросать ConcurrentModificationException
. Рассмотрим работает этот код:
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();
}
}
В моей системе он показывает следующий результат во время выполнения:
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)
Но с другой стороны, если вы сделаете блок кода, содержащий Iterator
для доступа к этому Vector
синхронизирован используя mapItems
в качестве блокировки, это предотвратит выполнение других методов, связанных с Vector
, до тех пор, пока блок synchronized
не будет завершен атомарно.
У вас есть правильный ответ, чтобы принять ?? – AmitG