Чи створює ітератор виняток ConcurrentModificationException?
2024Цей виняток виникає, коли об’єкт намагаються одночасно змінити без дозволу. Наприклад, якщо колекцію змінено, коли потік обходить її за допомогою ітератора, з ітератора створюється виняток ConcurrentModificationException.10 лютого 2022 р
Якщо один потік видає послідовність викликів методу, яка порушує контракт об’єкта, об’єкт може викликати цей виняток. Наприклад, якщо потік змінює колекцію безпосередньо під час ітерації по колекції за допомогою швидкого ітератора, ітератор викличе цей виняток.
На щастя, ми можемо використати кілька методів безпечного внесення змін до нашої колекції під час ітерації над нею, що не створить винятку.
- Використовуйте методи add() і/або remove() ітератора. …
- Створіть копію колекції для ітерації. …
- Використовуйте Java 8 Streams і filter() …
- Використовуйте паралельну колекцію.
Ітератор Fail-Fast призначений для створення a ConcurrentModificationException якщо колекцію змінено під час її проходження ітератором. Цей підхід гарантує, що ітератор одразу дізнається про будь-яку структурну модифікацію базової колекції.
Клас ConcurrentHashMap подібний до HashMap, за винятком того, що він є потокобезпечним і дозволяє змінювати під час ітерації. З результату зрозуміло, що ConcurrentHashMap піклується про новий запис у карті під час ітерації, тоді як HashMap видає ConcurrentModificationException .
Fail-Fast ітератори негайно викидати ConcurrentModificationException, якщо є структурна модифікація колекції. Структурна модифікація означає додавання, видалення будь-якого елемента з колекції, поки потік виконує ітерацію по цій колекції.
метод next(). Виняток ConcurrentModificationException може виникнути як у багатопотоковому, так і в однопоточному середовищах.