Given the code fragment:
List<Person> pList = new CopyOnWriteArrayList<Person>();
Which statement is true?
A.
Read access to the List should be synchronized.
B.
Write access to the List should be synchronized.
C.
Person objects retrieved from the List are thread-safe.
D.
A Person object retrieved from the List is copied when written to.
E.
Multiple threads can safely delete Person objects from the List.
Explanation:
CopyOnWriteArrayList produces a thread-safe variant of ArrayList in which all
mutative operations (add, set, and so on) are implemented by making a fresh copy of the
underlying array.
Note: his 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.
All elements are permitted, including null.
Memory consistency effects: As with other concurrent collections, actions in a thread prior to
placing an object into a CopyOnWriteArrayList happen-before actions subsequent to the access or
removal of that element from the CopyOnWriteArrayList in another thread.
Reference: java.util.concurrent.CopyOnWriteArrayList<E>
E