Core - 2

Приведите примеры итераторов, реализующих поведение fail-safe.


В Java существуют несколько итераторов, которые реализуют поведение fail-safe. Они обеспечивают безопасность и продолжают работу, даже если коллекция изменяется во время итерации. Вот некоторые из таких итераторов: 1. CopyOnWriteArrayList.Iterator: CopyOnWriteArrayList - это коллекция, которая создает копию элементов при каждом изменении. Его итератор, полученный с помощью метода iterator(), является fail-safe и работает с копией элементов, с которыми он был создан. Это позволяет безопасно итерироваться по коллекции, даже если другие потоки изменяют ее. import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; public class CopyOnWriteArrayListExample { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("One"); list.add("Two"); list.add("Three"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); list.add("New"); // изменение коллекции во время итерации } } } В этом примере мы создаем CopyOnWriteArrayList и добавляем в него несколько элементов. Затем мы получаем итератор и итерируемся по коллекции. Во время итерации мы добавляем новый элемент в коллекцию. Благодаря использованию CopyOnWriteArrayList и его итератора, программа продолжит работу без возникновения ConcurrentModificationException и выведет все элементы, включая новый добавленный. 2. ConcurrentHashMap.KeySetView.Iterator: ConcurrentHashMap - это реализация Map, которая обеспечивает безопасность при одновременном доступе из нескольких потоков. Итератор, полученный с помощью метода keySet().iterator(), является fail-safe и работает с замороженной копией ключей, с которыми он был создан. import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; public class ConcurrentHashMapExample { public static void main(String[] args) { ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("One", 1); map.put("Two", 2); map.put("Three", 3); Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); System.out.println(key); map.put("New", 4); // изменение коллекции во время итерации } } } В этом примере мы создаем ConcurrentHashMap и добавляем в него несколько элементов. Затем мы получаем итератор ключей и итерируемся по ним. Во время итерации мы добавляем новый элемент в коллекцию. Благодаря использованию ConcurrentHashMap и его итератора, программа продолжит работу без возникновения ConcurrentModificationException и выведет все ключи, включая новый добавленный. Оба этих примера демонстрируют итераторы, реализующие поведение fail-safe, которые обеспечивают безопасность и продолжение работы при изменении коллекции во время итерации.


Копировать ссылку