Потокобезопасность Collections.synchronizedList

109
07 августа 2019, 08:10

Какой смысл потокобезопасности Collections.synchronizedList если ее все равно нужно синхронизировать при итерации. Вот CopyOnWriteArrayList не нужно синхронизировать + он никогда не бросает ConcurrentModificationException. Если можно, пример где Collections.synchronizedList имеет смысл использовать взамен обычного ArrayList.

Answer 1

Collections.synchronizedList в сравнении с ArrayList имеет синхронизированные операции add, remove и т.п. Но итератор в данном случае не синхронизирован. Поэтому, при использовании итератора, synchronizedList нужно обязательно синхронизировать вручную.

List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
    Iterator i = list.iterator(); // Синхронизированный итератор
    while (i.hasNext())
        foo(i.next());   
}

CopyOnWriteArrayList действительно полностью синхронизирован, в том числе для итератора. Что именно использовать - зависит от логики приложения и личных предпочтений.

READ ALSO
Не может найти и загрузить main class. Win10

Не может найти и загрузить main class. Win10

Полагаю, что это один из самых распространенных вопросов от начинающихЯ учусь по учебнику с сайта ProgLang

130
Не вызывается onActivityResult()

Не вызывается onActivityResult()

Во время закрытия активити не выполняется onActivityResult()

114
Зачем нужны препроцессоры? [закрыт]

Зачем нужны препроцессоры? [закрыт]

Скажите, в каких ситуациях используют к примеру less если есть postcss с кучей полезных плагинов? например nextCss

128
Как заставить клиента ждать ответа от сервера socket.io, node js?

Как заставить клиента ждать ответа от сервера socket.io, node js?

Нужно сделать так чтобы клиент ждал ответа от сервераВнутри блока socket

127