`
wuhui
  • 浏览: 52023 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java.util.ConcurrentModificationException 异常解决办法

    博客分类:
  • java
阅读更多
【错误原因】:
当某个线程对一个Collection / Map进行遍历时,另外一个线程对其进行了修改。
一般情况下,map里面存放的对象越多、读写越频繁,这种异常出现的几率越大。
拿我遇到的情况举例:在一个竞价系统中,我用一个全局静态HashMap做缓存使用,里面存放用户报价记录。
前台用户报价实时写进该HashMap,同时会实时读取记录并next()方法进行遍历显示。

正常使用时,系统没有任何问题。但在进行压力测试时,并发数一旦超过200,就会抛出异常:
java.util.ConcurrentModificationException



【解决方法】:
给读写该map的方法加入同步约束:

public static Map map = new HashMap();

public static List mapToList(){
List list = new ArrayList();
synchronized (map) {
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
list.add(map.get(it.next()));
}
}
}

public static void addToMap(Record obj){
synchronized(map){
map.put(obj.getID(), obj);
}

}

红色部分是我后来加入的,加入后,就没再抛出异常。
注意,如果synchronized不是加载了map上,而是加在了方法声明上,是不起作用的。
分享到:
评论

相关推荐

    java.util.ConcurrentModificationException 异常问题详解1

    Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

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

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

    java.util.ConcurrentModificationException 解决方法

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

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

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

    Java语言的Util类详细介绍

    但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除元素),Iterator将抛出ConcurrentModificationException异常。 Set接口是Collection接口的子接口...

    JAVA.BUG模式详解

    本篇文章将深入探讨几个常见的JAVA.BUG模式,并提供相应的解决策略和优化技巧。 一、空指针异常(NullPointerException) 这是Java中最常见的错误之一,当尝试访问一个为null的对象的成员时,程序会抛出此异常。...

    java8集合源码-zinc-ConcurrentModificationException:锌并发修改异常

    java.util.ConcurrentModificationException: mutation occurred during iteration [error] scala.collection.mutable.MutationTracker$.checkMutations(MutationTracker.scala:43) [error] scala.collection....

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

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

    jdk 1.6 API 中文版帮助文档

    - `java.util.Iterator`的改进:支持`remove()`操作,避免抛出`ConcurrentModificationException`。 ### 4. 性能优化 JDK 1.6对编译器和垃圾收集器进行了优化,提高了运行效率,例如: - **Server VM的改进**: ...

    Java多线程安全集合

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

    迭代大师的修炼之道:Java中Iterator与增强for循环的深度解析

    - `Enhanced for loop`在遍历过程中不允许直接修改正在迭代的集合,否则会抛出`ConcurrentModificationException`异常。 - 当需要在遍历的同时修改集合时,应考虑使用`Iterator`或其他方法。 #### 四、进阶篇:...

    Java源码分析:深入探讨Iterator模式

    在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式(Iterator Pattern),这是一种常用的设计模式,它提供了一...

    concurrent.rar

    9. **并发异常处理**:在并发编程中,死锁、活锁、饥饿等是常见的问题,理解这些异常并学会避免和解决是提升并发编程能力的关键。 10. **并发编程最佳实践**:包括避免过度同步,减少锁粒度,正确使用线程池,以及...

    java常见的异常

    11. **NullPointerException**和**NullPointerException**:这两种异常在多线程编程中尤为常见,由于并发访问共享资源可能导致数据不一致,因此应使用`synchronized`关键字或`java.util.concurrent`包中的工具来管理...

    【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用.doc

    Fail-fast机制是一种快速失败机制,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常,从而导致遍历失败。这种机制下的集合容器,例如HashMap和ArrayList等,都是...

    Java 7编程高级进阶

    `java.util.concurrent.ForkJoinPool`和`java.util.concurrent.RecursiveTask`是其核心类。 7. **非阻塞堆栈跟踪(Non-blocking Stack Traces)** 当线程处于等待状态时,Java 7可以生成不包含阻塞信息的堆栈跟踪...

    java Iterator迭代器的使用

    - `ConcurrentModificationException`: 如果在迭代过程中,集合结构被其他线程修改,可能会抛出此异常。为了避免这种问题,通常建议在迭代时不要直接修改集合,或者使用`ListIterator`的`add()`方法添加元素。 6. ...

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

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

Global site tag (gtag.js) - Google Analytics