java.util.ConcurrentModificationException详解:www.jianshu.com/p/c5b52927a…
Java并发编程:并发容器之CopyOnWriteArrayList:www.cnblogs.com/dolphin0520…
java中List遍历删除元素:blog.csdn.net/github_2011…
单线程情况:
1)使用Iterator提供的remove方法,用于删除当前元素。
2)建立一个集合,记录需要删除的元素,之后统一删除。
3)不使用Iterator进行遍历,需要之一的是自己保证索引正常。
4)使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnArrayList,而不是ArrayList。
多线程情况:
1)使用并发集合类,如使用ConcurrentHashMap或者CopyOnWriteArrayList。
iterator为什么不抛出ConcurrentModificationException
可以看到迭代器中的remove()方法虽然也是用的ArrayList的remove()方法,正如前面所说,那也会对modCount的值进行改变,但是关键就在于expectedModCount = modCount,它会将改变的值重新赋给expectedModCount。但是如果直接用ArrayList的对象调用增删改的方法,modCount值得改变,不会引起expectedModCount值的变化,再次调用迭代器,调用到checkForComodification()方法时,便会抛出ConcurrentModificationException的错误。