In Java: Is List.iterator() thread-safe, i.e. does the returned iterator reflect the current state of the list at any time or just the state of the list at the time of its creation?

3 Answers

The behaviour of List.iterator() is not defined or consistent with different List implementations.

For ArrayList, LinkedList, you can get a ConcurrentModificationException if the list is modified when you are iterating over it. (This is not guaranteed) The way to avoid this issue is to use a synchronizedList() and lock the list while iterating over it.

For Vector, the collection is synchronized, but the iterator is not thread safe.

For CopyOnWriteArrayList, you get a snapshot of the elements in the list at the time you call iterator(), This iterator is thread safe, and you don't need to use any locking. Note: the contents of the elements can change.

No iterator is thread-safe. If the underlying collection is changed amidst iteration, a ConcurrentModificationException is thrown.

Even iterators of synchronized collections are not thread-safe - you have to synchronize manually.

One exception is the CopyOnWriteArrayList, which holds a snapshot during iteration.

2

It depends on what class you use,

not for Collections.synchronizedList(new ArrayList<>()); reason but

for CopyOnWriteArrayList reason.

best Description here

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy