If you look at the underlying array reference you’ll see it’s marked as
volatile. When a write operation occurs (such as in the above extract) this
volatile reference is only updated in the final statement via
setArray. Up until this point any read operations will return elements from the old copy of the array.
The important point is that the array update is an atomic operation and hence reads will always see the array in a consistent state.
The advantage of only taking out a lock for write operations is improved throughput for reads: This is because write operations for a
CopyOnWriteArrayList can potentially be very slow as they involve copying the entire list.