java-没有在迭代器中修改对象却出现ConcurrentModificationException的问题-对深浅复制(Deep&Shallow Copy)的思考

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值