Используя статические методы класса Collections:
Collections.synchronizedCollection(Collection<T> c)Collections.synchronizedList(List<T> list)Collections.synchronizedMap(Map<K,V> m)Collections.synchronizedSet(Set<T> s)Collections.synchronizedSortedMap(SortedMap<K,V> m)Collections.synchronizedSortedSet(SortedSet<T> s)Эти методы возвращают "обертки" (wrappers) над исходными коллекциями, которые делегируют вызовы методов оригинальным коллекциям, но делают это внутри synchronized блока, используя в качестве монитора объект-обертку.
Пример:
java
Важно помнить, что для итерации по такой синхронизированной коллекции в многопоточной среде требуется явная синхронизация по объекту-обертке, так как методы iterator() и forEach() не синхронизированы атомарно с итерацией.