Назад к вопросам
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.