ConcurrentModificationException から安全に Vector を反復処理できますか?
はい、Vector の反復を安全にしますConcurrentModificationException
。同期されていない場合、さまざまなスレッドを介して Vector にアクセスしていて、イテレータが作成された後、他のスレッドが 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