`

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics