Обратите внимание, что эта реализация не синхронизируется. Если несколько потоков обращаются к хеш-набору одновременно, и по крайней мере один из потоков изменяет набор, он должен быть синхронизирован извне. Обычно это выполняется путем синхронизации на некотором объекте, который, естественно, инкапсулирует набор. Если такой объект не существует, набор должен быть «завернут» с использованием метода Collections.synchronizedSet. Лучше всего это сделать во время создания, чтобы предотвратить случайный несинхронизированный доступ к набору:
Set s = Collections.synchronizedSet(new HashSet(...));
Итераторы возвращаемого метод итератора этого класса является отказоустойчивость быстро: если набор изменен в любое время после того, как итератор создается любым способом, кроме как через собственный метод удаления итератора, Iterator выбрасывает ConcurrentModificationException
. Таким образом, перед лицом одновременной модификации итератор быстро и чисто, а не рискует произвольным, недетерминированным поведением в неопределенное время в будущем.
Обратите внимание, что неэффективное поведение итератора не может быть гарантировано, поскольку, как правило, невозможно сделать какие-либо серьезные гарантии при наличии несинхронизированной параллельной модификации. Неуправляемые итераторы бросают ConcurrentModificationException
на основе наилучших усилий. Поэтому было бы неправильно писать программу, зависящую от этого исключения за ее правильность: отказоустойчивое поведение итераторов должно использоваться только для обнаружения ошибок.
В результате вы получите поврежденные данные и не сможете получить доверие. – TheLostMind
Что касается 'HashMap', вы можете получить мертвую петлю. – passion
@passion вы могли бы объяснить немного больше. Это что-то вроде бесконечного цикла? – filip