前言既然是绕过迭代器遍历时的数据修改异常,那么有必要先看一下是什么样的异常。根据上面的报错,可以追踪到报错位置 ArrayList.java 的 857 行和 907 行,追踪源码可以发现在迭代器的 next 方法的第一行,调用了 checkForComodification() 方法。同时也指出了这个字段通常会在迭代器 iterator 和 listIterator 返回的结果中使用,如果 modCount 和预期的值不一样,会抛出 ConcurrentModificationException 异常。如果列表结构没有被修改过,那么两者的值应该是一致的。绕过方式一:40 多亿次循环绕过上面分析了异常产生的位置和原因,是因为 modCount 的当前值和创建迭代器时的值有所变化。上来就递增了 正确输出了想要的 Hello,World,Java 。所以第二种思路是先把第三个元素C++ 更新为Java ,然后启动一个线程,在迭代器再次调用 next 方法后,把第四个元素移除掉。

Java 如何绕过迭代器遍历时的数据修改异常

Java 如何绕过迭代器遍历时的数据修改异常

Java 如何绕过迭代器遍历时的数据修改异常

Java 如何绕过迭代器遍历时的数据修改异常

Java 如何绕过迭代器遍历时的数据修改异常