问题解决: java.util.ConcurrentModificationException
来源:互联网 发布:cf刷枪软件免费版 编辑:程序博客网 时间:2024/06/06 02:45
问题描述
在H5性能测试平台系统的开发过程中,客户端调用服务端API,写入性能数据的时候,报了如下错误:
java.util.ConcurrentModificationException at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
错误代码:
/** * 记录性能数据,写入server的数据库中 * * @param requestResources */ private void recordPerfData(List<HashMap<String, String>> requestResources) { Log.i("TAGH5", "requestResources=" + JSON.toJSONString(requestResources)); for (HashMap<String, String> map : requestResources) { Log.i("TAGH5", "map=" + JSON.toJSONString(map)); callWriteRequestResourceHttpApi(map); } }
原因分析
foreach循环,在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。此时,调用迭代器取数据ArrayListIterator.next(),会报上面的异常。
所以,涉及集合类的多线程的场景的操作的时候,要小心。
解决办法
1) 通过Iterator修改Hashtable
while(it.hasNext()) {Object ele = it.next(); it.remove();}
2) 手动给Iterator遍历代码加锁,给修改HashMap的代码加锁。
3) 使用CopyOnWriteArrayList
CopyOnWriteArrayList是java.util.concurrent包中的一个List的实现类。
CopyOnWrite的意思是在写时拷贝,也就是如果需要对CopyOnWriteArrayList的内容进行改变,首先会拷贝一份新的List并且在新的List上进行修改,最后将原List的引用指向新的List。
使用CopyOnWriteArrayList可以线程安全地遍历,因为如果另外一个线程在遍历的时候修改List的话,实际上会拷贝出一个新的List上修改,而不影响当前正在被遍历的List。
上面的报错代码修改如下:
recordPerfData(CopyOnWriteArrayList<HashMap<String, String>> requestResources)
4) 如果是HashMap使用“ConcurrentHashMap”替换HashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
import java.util.concurrent.*;
小结
遍历List的同时操作List会发生异常:
java.util.ConcurrentModificationException
阅读全文
0 0
- java.util.ConcurrentModificationException问题解决
- 问题解决: java.util.ConcurrentModificationException
- 【ConcurrentModificationException】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 解决办法
- 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.util.ConcurrentModificationException
- kotlin学习笔记2
- hadoop实战随笔_0720
- springboot项目创建
- Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法
- HTML字符实体(Character Entities)与 转义字符串(Escape Sequence)
- 问题解决: java.util.ConcurrentModificationException
- Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition
- WebDriver API 大全
- Scala混用Java的集合类调用scala的foreach遍历问题
- Spring Boot集成Security使用数据库用户角色权限用户名问题
- Spring Boot集成Security使用数据库用户角色权限ROLE_问题
- SpringBoot集成logback.xml日志配置文件找不到错误
- SpringBoot集成日志logback.groovy报错: Groovy classes are not available on the class path. ABORTING INITIALIZATION.
- php学习笔记---变量和常量