在使用foreach循环遍历集合的过程中,如果集合被修改了,会抛出ConcurrentModificationException异常。
以这段代码为例子:
public class SynProblem {
List<Widget> widgetList = Collections.synchronizedList(new ArrayList<>());
{
widgetList.add(new Widget(1));
widgetList.add(new Widget(2));
widgetList.add(new Widget(3));
}
public void test() {
for (Widget w : widgetList) {
doSomethings(w);
}
}
private void doSomethings(Widget w) {
System.out.println(w);
}
public static void main(String[] args) {
SynProblem s = new SynProblem();
s.test();
}
}
使用javap反编译一下,可以看到在test方法中,for循环调用了iterator接口的方法
问题来了,foreach循环底层也是调用了iterator的方法,为什么在foreach循环add/remove集合元素,可能会抛出 ConcurrentModificationException 异常,但是使用ite