ベクターセーフの反復処理を から行いますか?ConcurrentModificationException?
YESあなたはさまざまなスレッドを経由してベクトルにアクセスしているといくつかの他のスレッドが構造的に任意のでベクトルを変更している場合には、そのような場合には、その後同期していない.IFそれはConcurrentModificationException
からベクトルの繰り返し処理を安全になりますイテレータが作成された後、イテレータは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)
しかし、その一方で、あなたがそのVector
にアクセスするためにIterator
を含むコードのブロックを作る場合は、同期 このコードを実行している考えてみましょうmapItems
をロックとして使用すると、ブロックがアトミックに完了するまで、Vector
に関連する他のメソッドの実行を防止します。
受け入れるための正解はありますか? – AmitG