Подтвердить что ты не робот

Является ли List.iterator() потокобезопасным?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Никакой итератор не является потокобезопасным. Если базовая коллекция изменяется на фоне итерации, генерируется ConcurrentModificationException.

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

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