博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
13.13 java.util.ConcurrentModificationException
阅读量:7085 次
发布时间:2019-06-28

本文共 1488 字,大约阅读时间需要 4 分钟。

13.13 java.util.ConcurrentModificationException

问题描述

在H5性能测试平台系统的开发过程中,客户端调用服务端API,写入性能数据的时候,报了如下错误:

java.util.ConcurrentModificationException at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)

错误代码:

/**     * 记录性能数据,写入server的数据库中     *     * @param requestResources     */    private void recordPerfData(List
> requestResources) { Log.i("TAGH5", "requestResources=" + JSON.toJSONString(requestResources)); for (HashMap
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();}
  1. 手动给Iterator遍历代码加锁,给修改HashMap的代码加锁。
  1. 使用CopyOnWriteArrayList

CopyOnWriteArrayList是java.util.concurrent包中的一个List的实现类。

CopyOnWrite的意思是在写时拷贝,也就是如果需要对CopyOnWriteArrayList的内容进行改变,首先会拷贝一份新的List并且在新的List上进行修改,最后将原List的引用指向新的List。

使用CopyOnWriteArrayList可以线程安全地遍历,因为如果另外一个线程在遍历的时候修改List的话,实际上会拷贝出一个新的List上修改,而不影响当前正在被遍历的List。

上面的报错代码修改如下:

recordPerfData(CopyOnWriteArrayList
> requestResources)
  1. 如果是HashMap使用“ConcurrentHashMap”替换HashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
import java.util.concurrent.*;

小结

遍历List的同时操作List会发生异常:

java.util.ConcurrentModificationException

转载地址:http://zcwql.baihongyu.com/

你可能感兴趣的文章
【leetcode】719. Find K-th Smallest Pair Distance
查看>>
jmeter使用csv传参进行并发测试验证
查看>>
Laravel踩坑笔记——illuminate/html被抛弃
查看>>
C++的重载(overload)与重写(override)
查看>>
android 常用的代码段整理 不断更新
查看>>
Android Tips
查看>>
lunix MySQL的卸载 过程随笔
查看>>
【DFS】UVa10129 - Play on Words
查看>>
【MATLAB】评价二值分割结果的函数
查看>>
计算机网络你还懵逼吗?持续更新!!!
查看>>
Java中的字符串问题
查看>>
JSP中的EL语言
查看>>
飞秋命令行
查看>>
mongodb
查看>>
高性能通道
查看>>
做题时一时没想起来的问题总结
查看>>
设计模式笔记--策略
查看>>
Eight(经典题,八数码)
查看>>
Balala Power!(大数+思维)
查看>>
[转]python-元类
查看>>