Synchronization of ArrayList in java
ArrayList is non-synchronized collection and should not be used in concurrent environment without explicit synchronization. It means if a thread modifies it structurally and multiple threads access it concurrently, it must be synchronized externally. Structural modification means addition or deletion of element(s) from the list or explicitly resizes the backing array. Changing the value of existing element is not structural modification.
There are two way to create Synchronized Arraylist.
1. Collections.synchronizedList() method. This method returns a synchronized thread-safe list backed by the specified list. It is recommended that we should manually synchronize on the returned list when traversing it via Iterator, Spliterator or Stream. Else it may result in non-deterministic behavior.
2. Using CopyOnWriteArrayList. CopyOnWriteArrayList is 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