ConcurrentModificationException一般出现在多者试图并发修改一个list时出现的报错。
起因,在调用
public int getSize() {
return objectList.size();
}
的时候报出了
java.util.ConcurrentModificationException
的异常。临时把这行代码屏蔽掉之后,在后续代码中的一个
for (Object object : objectList)
中又出现了这个问题。但是审视代码,仍然没有发现代码中有任何设计对list的更改。
但是,ConcurrentModificationException一般出现在多者试图并发修改一个list时出现的报错。
这就很奇怪了,进一步对objectList溯源,发现它被不止一次赋值给一个新的对象的constructor,而在constructor的内部对list的操作是:
this.objectList=objectList;
看到这里,大体上就破案了。由于objectList是浅复制,所以当objectList被不止一次赋值给一个新的对象的constructor后,对于每个新的对象中的list都指向一个相同的地址。所以哪怕当下只是对list执行访问操作,都有可能报出并发异常。
解决方法:将constructor的内部对list这类浅复制的操作改为深复制,以list为例:
this.objectList = new ArrayList<>(objectList);