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
相关推荐
项目中碰到的,记录一下解决方案
虽然提供了基本的线程安全性,但它们不是高度优化的并发解决方案,因为所有操作都需要全局锁定,可能导致性能瓶颈。 2. 并发集合(Concurrent Collections): Java的`java.util.concurrent`包提供了更为高效且...
在Java编程中,只读集合(Read-Only Collection)是一种不允许进行修改的集合类型,它提供了安全的数据访问...详细指导将涵盖各种使用场景、最佳实践以及可能遇到的问题和解决方案,帮助你成为一名更优秀的Java开发者。
- **并发容器**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`、`ConcurrentLinkedQueue`等,为并发访问提供了线程安全的解决方案。 - **阻塞队列**:`BlockingQueue`接口,实现生产者消费者模型,如`...
### Java常见问题及解决方案 #### 一、编译错误 **1.1 问题:** "cannot find symbol" **解决:** 这个错误提示通常意味着Java编译器未能找到指定的类、方法或变量。要解决这个问题,需要进行以下几个步骤的检查: ...
如果能查看博客的具体内容,将有助于提供更具体的解决方案。此外,`CoffeeSystem`可能是一个相关的系统或者类库,但没有足够的信息来进一步分析其与`iterator()`问题的联系。 为了更好地调试和解决问题,你可以按照...
本篇将深入探讨HashMap的线程安全问题,并提供相关的解决方案。 首先,我们需要了解HashMap在多线程环境下可能出现的问题: 1. **并发修改异常(ConcurrentModificationException)**:当多个线程同时修改HashMap...
`ConcurrentHashMap`是Java集合框架中的一个关键成员,它在`java.util.concurrent`包下,为并发操作提供了一种高效且线程安全的解决方案。与传统的`synchronized` `HashMap`相比,`ConcurrentHashMap`采用了分段锁的...
这个类位于Java的集合框架中,为程序员提供了灵活且性能优异的键值对存储解决方案。 **哈希表的工作原理** 哈希表基于数组和链表的组合实现。当插入一个新的键值对时,哈希函数会计算键的哈希码,然后根据这个哈希...
当多个线程同时调用`add`方法时,可能会抛出`java.util.ConcurrentModificationException`异常。 **4.2 解决方案** - 使用`Vector`类代替`ArrayList`,因为`Vector`的所有公共方法都进行了同步处理,但这种方法降低...
### 解决方案 1. **Collections.synchronizedMap()**:可以使用`Collections.synchronizedMap()`静态方法将`HashMap`包装成线程安全的`SynchronizedMap`。但请注意,尽管这个方法可以确保并发修改的安全,但仍然...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
在Java编程语言中,链表主要体现在`LinkedList`类中,它是Java集合框架的一部分,位于`java.util`包下。 链表的基本组成部分是节点(Node),每个节点包含数据元素和指向下一个节点的引用。在Java的`LinkedList`中...