Fail Safe Iterator:
Fail Safe Iterator makes copy of the internal data structure (object array) and iterates over the copied data structure.
Any structural modification done to the iterator affects the copied data structure. So ,original data structure remains structurally unchanged.
Hence, no ConcurrentModificationException throws by the fail safe iterator.
Two issues associated with Fail Safe Iterator are :
1. Overhead of maintaining the copied data structure i.e memory.
2. Fail safe iterator does not guarantee that the data being read is the data currently in the original data structure.
According to Oracle docs , fail safe iterator is ordinarily too costly, but may be more efficient than alternatives when traversal operations vastly outnumber mutations, and is useful when you cannot or don’t want to synchronize traversals, yet need to preclude interference among concurrent threads.
The "snapshot" style iterator method uses a reference to the state of the array at the point that the iterator was created.
This array never changes during the lifetime of the iterator, so interference is impossible and the iterator is guaranteed not to throw ConcurrentModificationException.
The iterator will not reflect additions, removals, or changes to the list since the iterator was created.
Element-changing operations on iterators themselves (remove(), set(), and add()) are not supported.
These methods throw UnsupportedOperationException.
How it deal?
While creating the iterator, take the snapshot of collections and don’t care that the collection is modified at iteration time.
Set, add and remove methods of iterator throws the UnsupportedOperationException.