陷阱并发修改异常

在使用迭代器对象提供的方法之外的方法迭代它时修改集合时会发生此异常。例如,我们有一个帽子列表,我们想删除所有有耳罩的人:

List<IHat> hats = new ArrayList<>();
hats.add(new Ushanka()); // that one has ear flaps
hats.add(new Fedora());
hats.add(new Sombrero());
for (IHat hat : hats) {
    if (hat.hasEarFlaps()) {
        hats.remove(hat);
    }
}

如果我们运行此代码,将引发 ***ConcurrentModificationException,***因为代码在迭代时修改了集合。如果使用相同列表的多个线程之一试图修改集合而其他线程迭代它,则可能发生相同的异常。多线程中集合的并发修改是很自然的事情,但是应该使用并发编程工具箱中的常用工具来处理,例如同步锁,并发修改采用的特殊集合,从初始修改克隆集合等。