Ответ 1
Как указано по этой ссылке:
CopyOnWriteArrayList - это параллельный класс Collection, представленный в Java 5 Concurrency API вместе со своим популярным двоюродным братом ConcurrentHashMap
в Java.
CopyOnWriteArrayList
реализует интерфейс List, такой как ArrayList
, Vector
и LinkedList
но представляет собой потокобезопасную коллекцию и обеспечивает свою многопотоковую безопасность немного по-другому, чем Vector или другой потокобезопасный класс коллекции.
Как следует из названия, CopyOnWriteArrayList создает копию базового ArrayList с каждой операцией мутации, например, добавлением или установкой. Обычно CopyOnWriteArrayList очень дорогой, потому что он включает в себя дорогостоящее копирование Array с каждой операцией записи, но он очень эффективен, если у вас есть List, где Iteration превосходит числовую мутацию, например, вам в основном нужно перебирать ArrayList и не изменять его слишком часто.
Итератор CopyOnWriteArrayList является отказоустойчивым и не создает исключение ConcurrentModificationException, даже если базовый CopyOnWriteArrayList изменяется после начала итерации, поскольку Iterator работает с отдельной копией ArrayList. Следовательно, все обновления, сделанные в CopyOnWriteArrayList, не доступны для Iterator.
Чтобы получить самую последнюю версию, сделайте новое чтение вроде list.iterator();
Тем не менее, обновление этой коллекции много убьет производительность. Если вы попытались отсортировать CopyOnWriteArrayList
вы увидите, что список выдает CopyOnWriteArrayList
UnsupportedOperationException
(сортировка вызывает набор в коллекции N раз). Вы должны использовать это чтение только тогда, когда вы читаете выше 90+%.