陷阱併發修改異常

在使用迭代器物件提供的方法之外的方法迭代它時修改集合時會發生此異常。例如,我們有一個帽子列表,我們想刪除所有有耳罩的人:

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,***因為程式碼在迭代時修改了集合。如果使用相同列表的多個執行緒之一試圖修改集合而其他執行緒迭代它,則可能發生相同的異常。多執行緒中集合的併發修改是很自然的事情,但是應該使用併發程式設計工具箱中的常用工具來處理,例如同步鎖,併發修改採用的特殊集合,從初始修改克隆集合等。