В каких ситуациях подходит CopyOnWriteArrayList? [дубликат]



этот вопрос уже есть ответ здесь:



я узнаю о CopyOnWriteArrayList класса.




  • какова цель копирования нового массива?

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


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

511   2  

2 ответов:

как указано на этом ссылке:

CopyOnWriteArrayList является параллельным классом коллекции, введенным в Java 5 Concurrency API вместе с его популярным двоюродным братом ConcurrentHashMap в Java.

CopyOnWriteArrayList реализует интерфейс списка, такой как ArrayList, Vector и LinkedList, но его потокобезопасная коллекция, и он достигает своей потокобезопасности немного иначе, чем вектор или другая потокобезопасная коллекция класс.

Как видно из названия, коллекция copyonwritearraylist создает копию основного ArrayList с каждой операцией мутации, например, add или set. Обычно CopyOnWriteArrayList очень дорого, потому что он включает в себя дорогостоящие Копирование массива с каждой операцией записи, но его очень эффективно, если вы есть список, где итерация превосходит мутацию например, вам в основном нужно повторите ArrayList и не изменяйте его слишком часто.

итератор из CopyOnWriteArrayList является отказоустойчивым и не бросает ConcurrentModificationException даже если базовых CopyOnWriteArrayList изменяется после начала итерации, потому что Итератор работает на отдельный экземпляр класса ArrayList. Следовательно, все обновления, сделанные в CopyOnWriteArrayList, недоступны для итератора.

чтобы получить самую обновленную версию, сделайте новое чтение, как list.iterator();

Это, как говорится, обновление этой коллекции много убьет производительность. Если вы попытались отсортировать CopyOnWriteArrayList, вы увидите, что список вызывает исключение UsupportedOperationException (сортировка вызывает набор в коллекции N раз). Вы должны использовать это чтение только тогда, когда вы делаете более 90+% чтений.

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

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

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

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

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

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

из javadoc CopyOnWriteArrayList

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

Comments

    Ничего не найдено.