Каким образом можно получить синхронизированные объекты стандартных коллекций
Через статические методы класса Collections, которые возвращают синхронизированные обертки (декораторы):
Пример
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());
Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());
Обертки синхронизируют каждый метод через synchronized(mutex). Однако составные операции (итерация, check-then-act) всё равно требуют ручной синхронизации:
Пример
synchronized (syncList) {
for (String s : syncList) {
// безопасная итерация
}
}
Начиная с Java 5, для многопоточного кода предпочтительны concurrent-коллекции: ConcurrentHashMap (вместо synchronizedMap), CopyOnWriteArrayList (вместо synchronizedList), ConcurrentLinkedQueue. Они обеспечивают лучшую масштабируемость за счет более гранулярной блокировки или lock-free алгоритмов.
На собеседовании: назовите Collections.synchronizedXxx() и покажите, что знаете о необходимости ручной синхронизации при итерации. Предложите ConcurrentHashMap и CopyOnWriteArrayList как более эффективные альтернативы.