Подтвердить что ты не робот

В каких ситуациях подходит CopyOnWriteArrayList?

Я изучаю класс CopyOnWriteArrayList.

  • Какова цель копирования нового массива?
  • Это для других потоков, чтобы прочитать массив?

Итак, если система имеет высокий concurrency, и большинство действий потоков не читают, лучше использовать CopyOnWriteArrayList.

4b9b3361

Ответ 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+%.

Ответ 2

Какова цель управления новым массивом?

Копирование базового массива гарантирует, что любая итерация структуры данных безопасна, поскольку итерация происходит по существенно неизменяемому "снимку" данных.

Это для других потоков, чтобы прочитать массив?

Сорт. Более конкретно, для каждого потока можно безопасно итерировать массив, не опасаясь поведения ConcurrentModificationException или другого неизвестного /undefined.

Итак, если система высока concurrency, и большинство действий потоков читают не записывать, лучше использовать CopyOnWriteArrayList. Я прав?

Нет. Только если большинство действий потоков являются итерациями по списку. Если большинство операций основаны на стандартном доступе, возможно, ReadWriteLock может быть лучше.

Из javadoc CopyOnWriteArrayList

Это обычно слишком дорого, но может быть более эффективным, чем альтернативы, когда операции обхода значительно превосходят количество мутаций и полезны, когда вы не можете или не хотите синхронизировать обходы, но все же необходимо исключить помехи между параллельными потоками.