Назад к вопросам
Middle+
73
questionbank
Приведите примеры итераторов, которые реализуют поведение fail-safe.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
CopyOnWriteArrayList и CopyOnWriteArraySet.
Итераторы этих коллекций работают с согласованным снимком данных, сделанным в момент создания итератора. Это обеспечивает их потокобезопасность при одновременном чтении и записи.
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Iterator;
import java.util.List;
public class FailSafeIteratorExample {
public static void main(String[] args) throws InterruptedException {
List<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
// Поток для изменения коллекции во время итерации
Thread modifierThread = new Thread(() -> {
try {
Thread.sleep(50); // Даем итератору начать работу
list.add("D");
System.out.println("Added D to the list");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
modifierThread.start();
System.out.println("Iterating over the list:");
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
try {
Thread.sleep(100); // Имитируем работу с элементом
} catch (InterruptedException e) {
e.printStackTrace();
}
}
modifierThread.join(); // Ждем завершения потока изменения
System.out.println("Final list: " + list); // Вывод конечного состояния списка
}
}
В данном примере, даже после добавления элемента "D" в другом потоке во время итерации, итератор продолжит обход элементов "A", "B", "C", которые были в списке на момент его создания. Итератор не выбрасывает ConcurrentModificationException.