Any collection class can be made thread safe by means of "synchronization wrapper":
List<E> synchArrayList = Collections.synchronizedList(new ArrayList<E>());
Map<K, V> synchHashMap = Collections.synchronizedMap(new HashMap<K, V>());
The methods of the resulting collections are protected by a lock, providing thread safe access.
You still need to use "client-side" locking if you want to "iterate" over the collection while another thread has the opportunity to mutate it:
synchronized (synchArrayList) {
Iterator<K> iter = synchArrayList.iterator();
while (iter.hasNext()) ...;
}
In the case, that an array list is frequently mutated, a synchronized "ArrayList" can outperform a "CopyOnWriteArrayList".