【发布时间】:2012-06-08 10:58:27
【问题描述】:
Enumeration 不会抛出 ConcurrentModificationException ,为什么?
见下面的代码。
public static void main(String[] args) {
Vector<String> v=new Vector<String>();
v.add("Amit");
v.add("Raj");
v.add("Pathak");
v.add("Sumit");
v.add("Aron");
v.add("Trek");
Enumeration<String> en=v.elements();
while(en.hasMoreElements())
{
String value=(String) en.nextElement();
System.out.println(value);
v.remove(value);
}
}
它只打印:
阿米特 帕塔克 阿隆为什么会出现这种行为。我们可以说Enumerator 是线程安全的吗?
编辑:使用迭代器时,它会在单线程应用程序中抛出 ConcurrentModificationException。
public static void main(String[] args) {
Vector<String> v=new Vector<String>();
v.add("Amit");
v.add("Raj");
v.add("Pathak");
v.add("Sumit");
v.add("Aron");
v.add("Trek");
Iterator<String> it=v.iterator();
while(it.hasNext())
{
String value=(String) it.next();
System.out.println(value);
v.remove(value);
}
}
请检查。
【问题讨论】:
-
这个问题的背景是什么?您是否正在考虑在多线程环境中使用枚举而不是迭代器?
-
是否有更多我们应该知道的代码?上面的示例代码中没有多线程,所以除非你有特定的理由来指责线程安全,否则我认为你在这里有点偏离轨道
-
请注意,ConcurrentModificationException 与多线程或线程安全意义上的并发无关。
-
枚举不保证抛出 ConcurrentModificationException,它仅在它注意到枚举对象中的不一致状态时才会这样做。另外:The functionality of this interface (Enumeration) is duplicated by the Iterator interface. In addition, Iterator adds an optional remove operation, and has shorter method names. New implementations should consider using Iterator in preference to Enumeration.
标签: java