Несколько потоков, использующих iterator.remove() в одной коллекции, возвращающих отказоустойчивый итератор
Оракул говорит
Обратите внимание, что Iterator.remove - единственный безопасный способ изменить коллекцию во время итерации; поведение не определено, если базовая коллекция изменена любым другим способом во время выполнения итерации.
Может ли это означать, что даже если несколько потоков итерируют вместе по одной и той же коллекции, безотказной реализации (Vector
,Hashmap
,ArrayList
,HashSet
) объект выполняют iterator.remove() не было бы ConcurrentModificationException
бросили?
2 ответа
Нет. Это говорит о том, что единственным безопасным способом удаления элементов во время итерации (в одном потоке) является использование iterator.remove. И если к коллекции обращаются (итерируют или изменяют) из других потоков - иногда вы получите исключение, иногда нет - в общем случае поведение не является детерминированным, поэтому вам следует избегать его использования или полагаться на него.
Это, как говорится, единственное исключение из этого являются параллельными коллекциями.
Это не означает, что несколько потоков могут удалять данные с помощью iterator.remove().
Если вы хотите добиться этого, вам нужно использовать синхронизированный тип коллекций. Даже в этом случае вы не должны пытаться использовать один и тот же итератор в двух потоках. Если у вас есть два потока, которым нужно удалить запись, то каждый из них должен иметь свои собственные итераторы.