Исходя из этой статьи, говорится:
Когда мы используем любой из методов изменения, например add () или remove (), все содержимое CopyOnWriteArrayList копируется в новую внутреннюю копию.
Благодаря этому простому факту мы можем безопасно перебирать список даже при одновременном изменении.
Когда мы вызываем метод iterator () для CopyOnWriteArrayList, мы получаем обратно Iterator, зарезервированный неизменным моментальным снимком содержимого CopyOnWriteArrayList.
Его содержимое является точной копией данных, находящихся внутри ArrayList с момента создания Iterator. Даже если тем временем какой-то другой поток добавляет или удаляет элемент из списка, эта модификация создает новую копию данных, которые будут использоваться при любом дальнейшем поиске данных из этого списка.
Следующий простой вопрос: почему и то, и другое? В основном, насколько я понимаю, операции записи выполняются с новой копией, а операция чтения - с клоном коллекции.
Если, например, записи выполняются в новой копии, это означает, что я могу перебирать исходную коллекцию, а это значит, что это не повлияет. Так зачем добавлять накладные расходы на хранение элементов внутри другой копии (снимка)? Или в обратном направлении, если я храню элементы внутри копии (снимка), почему запись должна выполняться на копии, когда я буквально повторяю клон, а не исходную коллекцию (что означает, что снимок никогда не изменится)?
Я надеюсь, что этот вопрос будет законным, поскольку я буквально проверил все возможные источники в Интернете, и ни одна статья не помогла мне устранить эту путаницу. Что мне здесь не хватает?