`
jzhua2006
  • 浏览: 308850 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

【原创】通过使用集合的迭代器进行更新、删除等操作时,出现java.util.ConcurrentModificationException 解决办法。

阅读更多

在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可。

 

但运行程序的时候,却发现出错了:
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
    at java.util.HashMap$KeyIterator.next(Unknown Source)
    at test.Test.main(Test.java:23)

 

从API中可以看到List等Collection的实现并没有同步化,如果在多线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用Iterator操作获得的Iterator对象在多线程修改Set的时候也自动失效,并抛出java.util.ConcurrentModificationException。这种实现机制是fail-fast,对外部的修改并不能提供任何保证。

 

Iterator是工作在一个独立的线程中,Iterator被创建的时候,建立了一个内存索引表(单链表),这个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。
如何才能满足需求呢,需要再定义一个List,用来保存需要删除的对象。

分享到:
评论

相关推荐

    出现java.util.ConcurrentModificationException 问题及解决办法

    在Java编程中,`java.util.ConcurrentModificationException` 是一个常见的运行时异常,通常发生在尝试并发修改集合时。这个异常的产生是由于集合类(如HashMap)的非线程安全特性,当你在一个线程中使用迭代器遍历...

    java.util.ConcurrentModificationException(解决方案).md

    在并发编程中,当多个线程同时...需要注意的是,在使用迭代器进行修改操作时,应避免添加元素,并处理好新旧集合的合并策略。掌握这些方法和原理,可以帮助开发者在实际开发中更加安全有效地处理并发集合的修改问题。

    java.util.ConcurrentModificationException 解决方法

    在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util.ConcurrentModificationException at java.util.HashMap$...

    com.harmonyos4.exception.ConcurrentModificationException.md

    对于普通的非并发集合类(如`ArrayList`),在迭代过程中要进行修改操作时,应该使用迭代器来进行。迭代器是专为此类操作设计的,提供了安全的方式来进行修改集合结构。需要注意的是,这种方式只支持迭代器提供的...

    java 集合并发操作出现的异常ConcurrentModificationException

    在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...

    java.util介绍.pdf

    - **注意事项**:使用`Vector`创建的迭代器时,如果其他线程修改了`Vector`的状态(如添加或删除元素),则可能会抛出`ConcurrentModificationException`异常。 #### 七、`Stack`类 `Stack`继承自`Vector`,实现了...

    ConcurrentModificationException解决办法.md

    当需要在迭代过程中修改集合,但是又不想使用迭代器的remove方法时,可以先对原集合进行复制,然后在复制的集合上进行修改操作。这样,原集合不会被直接修改,因此不会触发ConcurrentModificationException异常。...

    ConcurrentModificationException如何解决.md

    在多线程环境中,处理集合的迭代和修改操作时,必须注意`ConcurrentModificationException`异常的出现。我们可以选择使用线程安全的集合类,或者是通过同步机制保护关键代码块,以确保线程安全。这两种方法各有适用...

    java 迭代及迭代器的小例子

    例如,在java.util.concurrent包中的ConcurrentLinkedQueue等线程安全的集合类,它们的迭代器是弱一致性(weakly consistent)的,这意味着迭代器不会抛出ConcurrentModificationException,但可能不反映对集合的...

    【Java1迭代器】Java1迭代器

    在给定的文件内容中,介绍了如何在Java中使用迭代器,通过导入java.util.Iterator包,并使用iterator()方法获取迭代器实例,然后通过hasNext()和next()方法遍历集合并打印每个元素。这是一种典型的迭代器使用场景,...

    java Iterator迭代器的使用

    要使用`Iterator`,首先需要通过调用集合类的`iterator()`方法来获取迭代器实例。例如,对于ArrayList,代码可能如下所示: ```java ArrayList<String> list = new ArrayList(); // 添加元素... Iterator...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,通常发生在多线程环境下对集合进行迭代和修改操作时。此问题的核心在于,Java的集合类(如ArrayList、LinkedList、HashSet等)并不支持...

    ConcurrentModificationException(解决方案).md

    首先,可以使用迭代器进行迭代和修改集合。当迭代器创建后,你可以在迭代的过程中使用迭代器的 remove() 方法安全地移除元素。即使在迭代过程中集合被其他线程修改,这种做法也不会抛出 ...

    java基础 集合-22-迭代器设计模式

    为了解决这个问题,Java提供了`ConcurrentSkipListMap`和`CopyOnWriteArrayList`等线程安全的集合,它们的迭代器允许并发修改。 7. **增强型for循环(foreach)** Java 5引入了增强型for循环,也称为foreach循环,...

    多线程中使用Java集合类.doc

    这意味着在多线程环境下,当一个线程正在遍历集合(通过迭代器进行)时,另一个线程修改了集合内容,就会触发快速失败(fail-fast)机制,导致ConcurrentModificationException异常。例如,上述代码中,线程在删除...

    ConcurrentModificationException.md

    1. ConcurrentModificationException是一个在Java中多线程环境下修改集合时可能出现的异常,它通常发生在使用迭代器遍历集合的过程中,如果有其他线程或代码块修改了集合的内容,则可能会抛出该异常。 2. 解决该...

    集合类编程题(2),使用迭代器(2).zip

    假设`First.java`是主程序,它可能包含创建集合、添加`Student`对象并使用迭代器遍历集合的代码。而`Student.java`可能是定义`Student`类的文件,包含`Student`的属性和方法。 在`Student.java`中,可能有如下的...

    迭代器的用法

    如果需要在多线程环境中安全地遍历集合,可以考虑使用`java.util.concurrent`包中的并发集合类,它们提供了线程安全的迭代器。 总之,迭代器是Java集合框架的重要组成部分,它为遍历和操作集合提供了统一的接口,...

    Java多线程安全集合

    - `CopyOnWriteArrayList`和`CopyOnWriteArraySet`:这些列表和集在线程安全的迭代器上有优势,因为它们在修改时复制底层数组,从而避免了迭代过程中的并发修改异常(`ConcurrentModificationException`)。...

Global site tag (gtag.js) - Google Analytics