JAVA foreach中不能使用add/remove
java几种常用的遍历List的方式,for,foreach(增强for循环),iterator。其中在使用foreach和iterator循环时不能使用list的add/remove方法,会导致ConcurrentModificationException。
iterator迭代器
AbstractList类中维护了modCount(集合修改次数),而AbstractList中有一个内部类Itr(实现了Iterator接口)维护了一个expectedModCount(期望集合修改次数),在调用List的iterator方法时会先对expectedModCount赋值expectedModCount=modCount;而使用list的add/remove都会使List中的modCount + 1,却不会使expectedModCount + 1,从根本上导致了modCount != expectedModCount,引起报错ConcurrentModificationException(即快速失败(fail-fast))
源码截图:
transient关键字表示该字段不进行序列化


foreach循环
foreach循环的本质仍然是使用iterator实现的,所以会引起和iterator一样的问题。
解决方案
使用iterator类提供的add/remove方法,并且在高并发场景中应对iterator加锁。
本文介绍了Java中在使用foreach循环和iterator遍历List时,不能直接调用add/remove方法的原因,这会导致ConcurrentModificationException。文章深入解析了iterator的快速失败机制,并提供了在并发场景下安全修改集合的解决方案。同时,讲解了如何使用iterator的add/remove方法避免此类异常。
539

被折叠的 条评论
为什么被折叠?



