Является ли List.iterator () поточно-ориентированным? - PullRequest
19 голосов
/ 01 мая 2011

В Java: List.iterator() поточно-ориентирован, т.е. отражает ли возвращаемый итератор текущее состояние списка в любое время или только состояние списка на момент его создания?

Ответы [ 2 ]

32 голосов
/ 01 мая 2011

Поведение List.iterator () не определено или не соответствует различным реализациям List.

Для ArrayList, LinkedList, вы можете получить исключение ConcurrentModificationException, если список изменяется при его итерации по нему.(Это не гарантируется). Чтобы избежать этой проблемы, нужно использовать synchronizedList () и заблокировать список во время итерации по нему.

Для Vector коллекция синхронизируется, но итератор не является потокобезопасным.

Для CopyOnWriteArrayList вы получаете моментальный снимок элементов в списке во время вызова iterator (). Этот итератор является поточно-ориентированным, и вам не нужно использовать какую-либо блокировку.Примечание: содержимое элементов может меняться.

8 голосов
/ 01 мая 2011

Ни один итератор не является поточно-ориентированным. Если базовая коллекция изменяется во время итерации, выдается ConcurrentModificationException.

Даже итераторы синхронизированных коллекций не являются поточно-ориентированными - вам нужно синхронизировать вручную.

Единственным исключением является CopyOnWriteArrayList, который содержит снимок во время итерации.

...