Назад к вопросам
Junior
79
questionbank
Каким образом можно получить синхронизированные объекты стандартных коллекций в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Используя статические методы класса 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 блока, используя в качестве монитора объект-обертку.
Пример:
import java.util.*;
// Несинхронизированный список
List<String> nonSyncList = new ArrayList<>();
// Получаем синхронизированную версию
List<String> syncList = Collections.synchronizedList(nonSyncList);
// Теперь доступ к syncList из нескольких потоков будет безопасен,
// так как методы syncList синхронизированы.
// Пример использования в потоке
new Thread(() -> {
syncList.add("Привет из потока 1");
}).start();
new Thread(() -> {
syncList.add("Привет из потока 2");
}).start();
// Для итерации по синхронизированной коллекции из нескольких потоков
// необходимо явно синхронизировать блок итерации.
synchronized (syncList) {
for (String item : syncList) {
System.out.println(item);
}
}
Важно помнить, что для итерации по такой синхронизированной коллекции в многопоточной среде требуется явная синхронизация по объекту-обертке, так как методы iterator() и forEach() не синхронизированы атомарно с итерацией.