这是否使对 Vector 的迭代不受 ConcurrentModificationException 的影响?
是的,它使对 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)
但另一方面,如果您使用 as 锁使包含Iterator
访问该Vector
同步的代码块mapItems
,它将阻止与该块相关的其他方法的执行,Vector
直到该synchronized
块以原子方式完成。