java.util.ConcurrentModificationException详解
引用于http://blog.csdn.net/dabing69221/article/details/40065071
在使用set/map时,一个可爱的小bug:Java.util.ConcurrentModificationException
【错误场景1】:set容器,边遍历,边add/remove元素
Set<String> set = new HashSet<String>();for (int i = 0; i < 10000; i++) {set.add(Integer.toString(i));}for (String str : set) { //或使用iterator来循环,JDK5.0以上,这样的遍历底层也都是iterator实现。set.add("xxx"); //报错// set.remove(str); //报错}
【错误场景2】:map容器,边遍历,边remove元素
Map<String, String> map = new HashMap<String, String>();for (int i = 0; i < 100; i++) {map.put(Integer.toString(i), Integer.toString(i));}for (String str : map.keySet()) {//或使用iterator来循环map.remove(str); //报错}
【错误场景3】list容器,边遍历,边add/remove元素
List<String> list = new ArrayList<String>();for (int i = 0; i < 100; i++) {list.add(Integer.toString(i));}for (Iterator<String> it = list.iterator(); it.hasNext();) {String val = it.next();if (val.equals("5")) {list.add(val); //报错// list.remove(val); //报错}}
【错误原因】
- 对于remove操作,list.remove(o)的时候,只将modCount++,而expectedCount值未变,那么迭代器在取下一个元素的时候,发现该二值不等,则抛ConcurrentModificationException异常。
- 对于add操作,同remove
【解决办法】
- remove:用iterator提供的原生态remove()
add:同remove就错了,iterator没有提供原生的add()方法。真是的,还要用新的容器暂存,然后再遍历结束后,全部添加到原容器当中。
set/list:这两类常用容器,就用上面说的方法remove(), add()就好了。
map:直接使用ConcurrentHashMap就ok。为什么别的容器,不也实现个concurrent版本直接用。。?库里不搞,自己搞。
【正确使用案例】
for (Iterator<String> it = list.iterator(); it.hasNext();) {String val = it.next();if (val.equals("5")) {it.remove();}}
List<String> newList = new ArrayList<String>();for (Iterator<String> it = list.iterator(); it.hasNext();) {String val = it.next();if (val.equals("5")) {newList.add(val);}}list.addAll(newList);
java.util.ConcurrentModificationException详解的更多相关文章
- java并发包java.util.concurrent详解
线程池ThreadPoolExecutor的使用 并发容器之CopyOnWriteArrayList 并发容器之CopyOnWriteArraySet 数据结构之ConcurrentHashMap,区 ...
- java.util包详解
介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...
- Java.util.ArrayList详解
java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...
- [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier
转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...
- [转载] java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
转载自http://janeky.iteye.com/blog/770393 ------------------------------------------------------------- ...
- [转载] java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor
转载自http://janeky.iteye.com/blog/770441 ------------------------------------------------------------- ...
- [转载] java多线程学习-java.util.concurrent详解(四) BlockingQueue
转载自http://janeky.iteye.com/blog/770671 ------------------------------------------------------------- ...
- java.util.ConcurrentModificationException 异常问题详解
环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常, ...
- java.util.ConcurrentModificationException解决详解
异常产生 当我们迭代一个ArrayList或者HashMap时,如果尝试对集合做一些修改操作(例如删除元素),可能会抛出java.util.ConcurrentModificationExceptio ...
随机推荐
- 用SQL语句创建和删除Access数据库中的表;添加列和删除列
用SQL语句创建和删除Access数据库中的表;添加列和删除列 Posted on 2009-08-11 13:42 yunbo 阅读(1240) 评论(0) 编辑 收藏 用SQL语句创建和删除Acc ...
- C++中模板的特化与偏特化
1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理 ...
- ionic3 自定义组件 滑动选择器 ion-multi-picker
1.ionic3中有一个 ion-datatime 给大家选择时间提供了一个很方便的组件 效果如图 链接 https://ionicframework.com/docs/api/component ...
- django rest_framework 分页出现报错
1.出现: WARNINGS: ?: (rest_framework.W001) You have specified a default PAGE_SIZE pagination rest_fram ...
- Python 进程池的同步方法
import time from multiprocessing import Process,Pool def f1(n): time.sleep(1) #print(n) return n*n i ...
- 3.2 unittest执行顺序
3.2 unittest执行顺序 前言很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.本篇通过最简单案例 ...
- linux 命令失效
失效的原因 是我在执行命令的时候输入错误了.在网上找了很多的办法都是以下两种方式: 其一:直接在linux命令行界面输入如下,然后回车(导入环境变量,以及shell常见的命令的存放地址): exp ...
- POJ 1284:Primitive Roots(素数原根的个数)
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5709 Accepted: 3261 Descr ...
- CSVN配置自动备份策略
在浏览器中登录CSVN管理页面,登录地址就是ip:3343,版本库->backup schedule ,选择type of job(备份类型),when to run(备份频率和时间),numb ...
- js+css jQuery实现页面后退执行 & 遮罩弹框
JS部分 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script> < ...