A CopyOnWriteArrayList
предоставляет вам поточно-ориентированные итераторы, так как вы можете выполнять итерацию списка во время его одновременного изменения, не выбрасывая ConcurrentModificationException
.
Логически (не на самом деле, потому что это неэффективно и не поточно-ориентировано), итерация CopyOnWriteArrayList
выглядит следующим образом:
List<Integer> copyOfList = new ArrayList<>(myList);
for (Integer it : copyOfList) {
// ...
}
Если какое-либо обновление списка происходит во время итерации, это не имеет значения: вы выполняете итерацию «копии» списка в начале итерации.
Вы ненадолго спите в теме перед добавлением элемента; но к тому времени основной поток уже начал перебирать список.
Поскольку список изначально имеет 4 элемента, итерация списка начинается до того, как поток добавляет элемент, ваш цикл выведет 4 элемента.