Метод synchronizedList
Метод synchronizedList класса Collections возвращает
синхронизированную (потокобезопасную) обертку над переданным
списком. В первый параметр мы передаем список, который нужно
обернуть. Метод возвращает объект типа List, все методы
которого защищены внутренней синхронизацией, что позволяет
безопасно использовать список из нескольких потоков.
Важно понимать: метод не создает копию списка, а возвращает обертку над исходным списком. Это означает, что все изменения отражаются на исходном списке, а для корректной итерации по синхронизированному списку необходимо вручную синхронизироваться на самом объекте списка.
Синтаксис
Collections.synchronizedList(list)
Пример
Давайте создадим синхронизированный список на основе
обычного ArrayList и добавим в него элементы:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> list = new ArrayList<>();
List<String> syncList = Collections.synchronizedList(list);
syncList.add("a");
syncList.add("b");
syncList.add("c");
System.out.println(syncList);
System.out.println(list);
}
}
Результат выполнения кода:
[a, b, c]
[a, b, c]
Обратите внимание, что изменения в синхронизированном списке
отразились и на исходном списке list, так как обертка
не создает копию.
Пример
Давайте получим синхронизированный список напрямую из метода
synchronizedList и проверим его размер:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List<Integer> syncList = Collections.synchronizedList(list);
System.out.println(syncList.size());
System.out.println(syncList.get(1));
}
}
Результат выполнения кода:
3
2
Пример
Давайте выполним безопасную итерацию по синхронизированному списку с ручной синхронизацией:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> list = new ArrayList<>(List.of("a", "b", "c", "d", "e"));
List<String> syncList = Collections.synchronizedList(list);
synchronized (syncList)
{
for (String element : syncList)
{
System.out.println(element);
}
}
}
}
Результат выполнения кода:
"a"
"b"
"c"
"d"
"e"
Смотрите также
-
класс
Collections,
который содержит статические методы для работы с коллекциями -
метод
unmodifiableList,
который создает неизменяемый список -
метод
singletonList,
который создает список из одного элемента -
метод
emptyList,
который возвращает пустой список