JAVA 运行时报错:catch an exception java.util.ConcurrentModificationException

来源:互联网 发布:阿里移动推荐算法代码 编辑:程序博客网 时间:2024/06/05 14:59

写代码时候遇到,记一笔。

Map<String, String> needToQueryDate = new HashMap<String, String>();needToQueryDate.add("201708","Y");needToQueryDate.add("201707","Y");needToQueryDate.add("201706","Y");needToQueryDate.add("201705","N");List<String> newUserNeedToQueryDate = new ArrayList<String>();needToQueryDate.add("201708");needToQueryDate.add("201707"); for(String needToQueryDateItem : needToQueryDate.keySet()){if(!needToQueryDate.contains(needToQueryDateItem)){needToQueryDate.remove(needToQueryDateItem);}

2017-08-02 15:37:19,599 [jboss-server-executor-4] ERROR QueryServiceImpl - TraceId:9914, catch an exceptionjava.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)at java.util.HashMap$KeyIterator.next(HashMap.java:828)at com.zzf.service.impl.QueryServiceImpl.handleLib(QueryServiceImpl.java:726)at com.zzf.service.impl.QueryServiceImpl.billQuery(QueryServiceImpl.java:187)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43)at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)at java.lang.Thread.run(Thread.java:662)


Google原因为:

Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。


Google解决办法有:

1) 根据实际程序,手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。
2) 使用ConcurrentHashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。

阅读全文
0 0
原创粉丝点击