1. CopyOnWriteArrayList

Операції add, set, remove у цій колекції призводять до створення нової копії внутрішнього масиву. Це гарантує те, що ми не зловимо ConcurrentModificationException.

Не забувай лише про те, що при копіюванні масиву копіюються лише посилання на об'єкти, включно з доступом до полів елементів не thread-safe. Такі колекції краще використовувати у випадках з мінімальною кількістю write операцій.

CopyOnWriteArrayList<E> – потокобезпечний аналог ArrayList, реалізований на основі CopyOnWrite алгоритмів. Додаткові методи та конструктор описані нижче:

CopyOnWriteArrayList(E[] toCopyIn) Конструктор, який приймає на вхід масив.
int indexOf(E e, int index) Повертає індекс першого знайденого елемента, починаючи пошук із заданого індексу.
int lastIndexOf(E e, int index) Повертає індекс першого знайденого елемента при зворотному пошуку, починаючи із вказаного індексу.
boolean addIfAbsent(E e) Додати елемент, якщо його нема в колекції. Для порівняння елементів використовується метод equals.
int addAllAbsent(Collection<? extends E> c) Додати елементи, якщо їх нема в колекції. Повертає кількість доданих елементів.

2. Інтерфейс ConcurrentMap

Покращені реалізації HashMap та TreeMap із підтримкою багатопотоковості та масштабованості.

ConcurrentMap<K, V> – інтерфейс, що розширюєMap додатковими атомарними операціями.

V putIfAbsent(K key, V value) Додає нову пару key-value тільки в тому випадку, якщо ключа нема в колекції. Повертає попереднє значення вказаного ключа.
boolean remove(Object key, Object value) Видаляє key-value пару тільки якщо вказаному ключу відповідає встановлене значення Map. Повертає true, якщо елемент успішно видалено.
boolean replace(K key, V oldValue, V newValue) Замінює старе значення на нове за ключем, лише якщо старе значення відповідає встановленому значенню в Map. Повертає true, якщо значення замінено на нове.
V replace(K key, V value) Замінює старе значення на нове за ключем, тільки якщо ключ асоційований з будь-яким значенням. Повертає попереднє значення заданого ключа.

ConcurrentHashMap<K, V> – тут дані представлені у вигляді сегментів, які розбиті по hash-ам ключів. У підсумку, якщо тобі потрібен доступ, тягнеться сегмент, а не об'єкт. Ітератори не кидають ConcurrentModificationException і подають дані на певний відрізок часу.

3. Реалізації ConcurrentHashMap

ConcurrentHashMap <K, V> – тут дані представлені у вигляді сегментів, які розбиті по hash-ам ключів. В результаті, для доступу до даних лочиться по сегментам, а не по одному об'єкту. На додаток ітератори надають дані на певний час і не кидають ConcurrentModificationException.

ConcurrentNavigableMap<K,V> – розширює інтерфейс NavigableMap та повертає ConcurrentNavigableMap. Усі ітератори безпечні для використання і не кидають ConcurrentModificationException.

ConcurrentSkipListMap <K, V> є аналогом TreeMap для багатопотоковості. Дані сортуються за ключем і гарантується усереднена продуктивність log(N) для containsKey, get, put, remove та інших схожих операцій.

ConcurrentSkipListSet<E> – імплементація інтерфейсу Set на основі ConcurrentSkipListMap.