`

java.util.ConcurrentModificationException 原因及解决方案

    博客分类:
  • JAVA
阅读更多
12:13:30,822 [ERROR] 优惠券缓存 初始化本地数据异常  >> com.anxin.ssk.cache.CouponCache:202
java.util.ConcurrentModificationException

	at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)

	at java.util.HashMap$EntryIterator.next(HashMap.java:833)

	at java.util.HashMap$EntryIterator.next(HashMap.java:831)

	at com.anxin.ssk.cache.CouponCache.filterData(CouponCache.java:310)

	at com.anxin.ssk.cache.CouponCache.downloadAndSaveData(CouponCache.java:410)

	at com.anxin.ssk.cache.CouponCache.readLocal(CouponCache.java:291)

	at com.anxin.ssk.cache.CouponCache.initCache(CouponCache.java:196)

	at com.anxin.ssk.task.Scheduler$5.run(Scheduler.java:158)

	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)

	at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)

	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)

	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)

	at java.lang.Thread.run(Thread.java:619)

 

主要原因:

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

 

相关信息:

网上查找的关于Iterator的工作机制。Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。

 

解决方案:

原:

private static Map<String, Product> _couponMap = new HashMap<String, Product>();

 

改:

private static Map<String, Product> _couponMap = new ConcurrentHashMap<String, Product>();

 

参考来源:http://www.cnblogs.com/frankliiu-java/articles/1759460.html

分享到:
评论

相关推荐

    Java多线程安全集合

    虽然提供了基本的线程安全性,但它们不是高度优化的并发解决方案,因为所有操作都需要全局锁定,可能导致性能瓶颈。 2. 并发集合(Concurrent Collections): Java的`java.util.concurrent`包提供了更为高效且...

    Java 实例 - 只读集合源代码+详细指导教程.zip

    在Java编程中,只读集合(Read-Only Collection)是一种不允许进行修改的集合类型,它提供了安全的数据访问...详细指导将涵盖各种使用场景、最佳实践以及可能遇到的问题和解决方案,帮助你成为一名更优秀的Java开发者。

    Java并发编程的艺术.zip

    - **并发容器**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`、`ConcurrentLinkedQueue`等,为并发访问提供了线程安全的解决方案。 - **阻塞队列**:`BlockingQueue`接口,实现生产者消费者模型,如`...

    Java 常见问题解决集合.docx

    ### Java常见问题及解决方案 #### 一、编译错误 **1.1 问题:** "cannot find symbol" **解决:** 这个错误提示通常意味着Java编译器未能找到指定的类、方法或变量。要解决这个问题,需要进行以下几个步骤的检查: ...

    关于方法iterator()找不着的问题~~~~~

    如果能查看博客的具体内容,将有助于提供更具体的解决方案。此外,`CoffeeSystem`可能是一个相关的系统或者类库,但没有足够的信息来进一步分析其与`iterator()`问题的联系。 为了更好地调试和解决问题,你可以按照...

    高级程序员必会的HashMap的线程安全问题,适用于0~2年的.7z

    本篇将深入探讨HashMap的线程安全问题,并提供相关的解决方案。 首先,我们需要了解HashMap在多线程环境下可能出现的问题: 1. **并发修改异常(ConcurrentModificationException)**:当多个线程同时修改HashMap...

    ConcurrentHashMap:今天在看Spring源码的时候发现了一个并发安全的hashmap,自己就手写实现了一下

    `ConcurrentHashMap`是Java集合框架中的一个关键成员,它在`java.util.concurrent`包下,为并发操作提供了一种高效且线程安全的解决方案。与传统的`synchronized` `HashMap`相比,`ConcurrentHashMap`采用了分段锁的...

    DataStructures:Java中的哈希表

    这个类位于Java的集合框架中,为程序员提供了灵活且性能优异的键值对存储解决方案。 **哈希表的工作原理** 哈希表基于数组和链表的组合实现。当插入一个新的键值对时,哈希函数会计算键的哈希码,然后根据这个哈希...

    高并发常见面试题(深入底层).docx

    当多个线程同时调用`add`方法时,可能会抛出`java.util.ConcurrentModificationException`异常。 **4.2 解决方案** - 使用`Vector`类代替`ArrayList`,因为`Vector`的所有公共方法都进行了同步处理,但这种方法降低...

    hashmap-thread-test:测试 Java HashMap 是否是线程安全的

    ### 解决方案 1. **Collections.synchronizedMap()**:可以使用`Collections.synchronizedMap()`静态方法将`HashMap`包装成线程安全的`SynchronizedMap`。但请注意,尽管这个方法可以确保并发修改的安全,但仍然...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    DATASTRUCTURES-LINKEDLIST

    在Java编程语言中,链表主要体现在`LinkedList`类中,它是Java集合框架的一部分,位于`java.util`包下。 链表的基本组成部分是节点(Node),每个节点包含数据元素和指向下一个节点的引用。在Java的`LinkedList`中...

Global site tag (gtag.js) - Google Analytics