JAVA 运行时报错:catch an exception java.util.ConcurrentModificationException
2017-08-02 19:51
507 查看
写代码时候遇到,记一笔。
Google原因为:
Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。
Google解决办法有:
1) 根据实际程序,手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。
2) 使用ConcurrentHashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
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 exception java.util.ConcurrentModificationException at 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会自己检查修改操作,对其加锁,也可针对插入操作。
相关文章推荐
- java.util.ConcurrentModificationException 的解决办法
- java.util.ConcurrentModificationException的异常的出现与解决
- Iterator遍历时报错 java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException 报错
- java.util.ConcurrentModificationException异常分析
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- 异常记录——java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException 解决方法
- java Map java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException的解决办法 大家应该都知道, 在java中, 在对一些集合迭代的过程中对集合进行一些修改的操作, 比如说add,re
- java.util.ConcurrentModificationException解决
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException异常 分析
- java java.util.ConcurrentModificationException 原因
- 解决:java.util.ConcurrentModificationException问题
- java.util.ConcurrentModificationException详解
- java.util.ConcurrentModificationException 解决办法
- java.util.ConcurrentModificationException