3 回答
TA贡献1906条经验 获得超10个赞
Iterator it = map.entrySet().iterator();while (it.hasNext()){
Entry item = it.next();
map.remove(item.getKey());} Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
Entry item = it.next();
it.remove();
}TA贡献2051条经验 获得超10个赞
CollectionCollectionIteratorCollectionCollectionCollectionCollection.iterator()forIterator.next()forCollection
CollectionConcurrentModificationExceptionCollectionConcurrentModificationException.
ConcurrentModificationException
此异常可能由检测到对象的并发修改的方法引发,而这种修改是不允许的.
请注意,此异常并不总是指示对象已被不同线程并发修改。如果单个线程发出一系列违反对象契约的方法调用,该对象可能会抛出此异常.
请注意,通常情况下,不能保证快速失败的行为在存在不同步并发修改的情况下提供任何硬的保证。失败操作抛出 ConcurrentModificationException在尽最大努力的基础上。
例外 可以,可能
被扔,而不是扔 必
被抛出 不需要不同的线程。 无法保证抛出异常 抛出异常是在尽力而为的基础上进行的。 抛出异常会发生
HashSet, HashMap, TreeSetArrayList
[直接或间接地从该类返回的迭代器]失败快速:如果[集合]在迭代器创建后的任何时候被修改,则除通过迭代器自身的Remove方法外,以任何方式修改 Iterator抛出 ConcurrentModificationException..因此,在并发修改的情况下,迭代器会迅速而干净地失败,而不是在未来某个未定的时间冒着任意的、不确定的行为的风险。
请注意,迭代器的快速失败行为不能保证,一般来说,在不同步并发修改的情况下不可能提供任何硬的保证。失败快速迭代器抛出 ConcurrentModificationException在尽最大努力的基础上。因此,编写一个依赖于此异常的程序是错误的: 迭代器的抗故障行为应该仅用于检测bug。.
Map
非并发实现应该覆盖此方法,并在最大努力的基础上抛出 ConcurrentModificationException如果检测到映射函数在计算期间修改此映射。并发实现应该覆盖此方法,并在最大努力的基础上抛出 IllegalStateException如果检测到映射函数在计算期间修改此映射,则计算将永远不会完成。
ConcurrentModificationException
调试 ConcurrentModificationException
ConcurrentModificationExceptionCollectionCollectionCollection
最常见的原因是修改 Collection在增强的范围内 for循环在 Collection..仅仅因为你没有看到 Iterator对象在您的源代码中并不意味着没有 Iterator那里!幸运的是,有一个错误的说法 for循环通常在堆栈跟踪中,因此跟踪错误通常很容易。 更棘手的情况是,当您的代码在引用中传递到 Collection对象。请注意 不可修改
收藏的视图(如由 Collections.unmodifiableList())保留对可修改集合的引用,因此 (修改已在其他地方完成)。其他 意见
你的 Collection,如 和 还保留对原始(可修改)的引用 Collection..这可能是一个问题,即使是线程安全。 Collection,如 不要假设线程安全(并发)集合永远不会抛出异常。 哪些操作可以修改 Collection在某些情况下可能是意外的。例如, 最困难的情况是例外 是
由多个线程并发修改造成的。
防止并发修改错误的编程
CollectionCollection a privateCollectionCollectionCollectionCollection
添加回答
举报
