В HashSet.java в JDK 1.6 есть некоторые комментарии о свойстве отказоустойчивости итератора HashSet.
Итераторы, возвращаемые методом итератора этого класса, являются отказоустойчивыми: если набор изменяется в любое время после создания итератора любым способом, кроме как с помощью собственного метода удаления итератора, итератор создает исключение ConcurrentModificationException. Таким образом, перед лицом одновременной модификации итератор быстро и чисто дает сбой, а не рискует произвольным, недетерминированным поведением в неопределенное время в будущем.
Я могу понять приведенный выше абзац, потому что он довольно прост и ясен, но я не могу понять следующий абзац. Я могу понять это, если у меня есть несколько простых примеров, показывающих, что отказоустойчивый итератор может даже дать сбой.
Обратите внимание, что безотказное поведение итератора не может быть гарантировано, так как, вообще говоря, невозможно дать какие-либо жесткие гарантии при наличии несинхронизированной параллельной модификации. Отказоустойчивые итераторы генерируют исключение ConcurrentModificationException в максимально возможной степени. Поэтому было бы неправильно писать программу, корректность которой зависела бы от этого исключения: безотказное поведение итераторов следует использовать только для обнаружения ошибок.