在使用list集合的时候,可能会抛这个异常。具体分析,可能发生这个异常的情况有以下三种情况。我分别做了测试。
1:使用迭代器迭代的时候,集合结构遭到修改
2:for each 删除集合元素
3:多线程并发操作一个集合时候
具体都在下面测试代码里。一并都给测了。
package com.lxk.ConcurrentModificationExceptionTest;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
/**
* ConcurrentModificationException的出现情况
* <p>
* Created by lxk on 2016/11/11
*/
public class ConcurrentModificationExceptionTest {
public static void main(String[] args) {
modCountTest();
}
/**
* modCount相关测试
*/
private static void modCountTest() {
List<String> list = Lists.newArrayList();
setListData(list);//给list设值:{0-9}
System.out.println("原来未修改集合" + list);
//wrongWay0(list); //1:使用迭代器迭代的时候,集合结构遭到修改
//rightWay1(list); // for循环删除安全
//wrongWay1(list); //2:for each 删除集合元素
wrongWay2(list); //3:多线程并发操作一个集合时候
System.out.println("被修改过的集合" + list);
}
/**
* 获得一个list集合
*/
private static void setListData(List<String> list) {
for (int i = 0; i < 10; i++) {
list.add(i + "");
}
}
/**
* 第一种:会抛ConcurrentModificationException的异常方法
*/
private static void wrongWay0(List<String> list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String temp = iterator.next();
if (iterator.next().equals("5")) {
//iterator.remove();//正确移除集合元素姿势
list.remove(temp);//抛异常移除集合元素姿势
}
}
}
/**
* 第二种:会抛ConcurrentModificationException的异常方法
*/
private static void wrongWay1(List<String> list) {
for (String s : list) {
if ("5".equals(s)) {
list.remove(s);
}
}
}
/**
* 第二种:不抛异常姿势。
* (若只是简单循环集合,可用for each循环,若要增删集合,则用for i 循环,避免出错)
*/
private static void rightWay1(List<String> list) {
for (int i = 0; i < list.size(); i++) {
if ("5".equals(list.get(i))) {
list.remove(i);
}
}
}
/**
* 第三种:会抛ConcurrentModificationException的异常方法
*/
private static void wrongWay2(final List<String> list) {
new Thread(new Runnable() {
@Override
public void run() {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("4")) {
list.remove(i);
}
}
}
}).start();
}
}