[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-kakie-sushchestvuyut-concurrent-collections-i-v-chyom-ikh-osobennosti":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":21,"progress":22,"seo":23},299,"kakie-sushchestvuyut-concurrent-collections-i-v-chyom-ikh-osobennosti",8,"mnogopotochnost","Многопоточность","🔀","Какие существуют Concurrent Collections и в чём их особенности?","\u003C!-- grade: 5\u002F5 — исчерпывающий обзор всех основных коллекций -->\n\nПакет `java.util.concurrent` содержит потокобезопасные коллекции, спроектированные для эффективной работы в многопоточной среде без внешней синхронизации.\n\n**1. `ConcurrentHashMap`** — основная рабочая лошадка\n\nПотокобезопасная хэш-таблица, заменяющая `Hashtable` и `Collections.synchronizedMap()`.\n\n- Не блокирует всю таблицу — в Java 8+ использует блокировку на уровне отдельных бакетов + CAS.\n- Операции чтения обычно без блокировки.\n- **Не допускает `null`** ни как ключ, ни как значение.\n- Итератор weakly consistent.\n\n```java\nConcurrentHashMap\u003CString, Integer> map = new ConcurrentHashMap\u003C>();\nmap.put(\"key1\", 1);\n\n\u002F\u002F Атомарные составные операции\nmap.putIfAbsent(\"key2\", 2);\nmap.compute(\"key1\", (key, value) -> value + 1);\nmap.merge(\"key1\", 10, Integer::sum);\n\n\u002F\u002F Параллельные агрегатные операции (Java 8+)\nlong count = map.reduceValues(1, Long::sum);\nmap.forEach(2, (key, value) -> System.out.println(key + \"=\" + value));\n```\n\n**2. `CopyOnWriteArrayList`** — для редко изменяемых списков\n\nКаждая мутация создаёт новую копию внутреннего массива.\n\n- Чтение — без блокировки, без затрат.\n- Запись — дорогая (копирование всего массива).\n- Идеально для списков слушателей\u002Fobservers.\n- Итератор — snapshot, не выбрасывает `ConcurrentModificationException`.\n\n**3. `CopyOnWriteArraySet`** — `Set` на базе `CopyOnWriteArrayList`.\n\n**4. `ConcurrentLinkedQueue`** — lock-free очередь\n\nНеблокирующая очередь на алгоритме Майкла-Скотта.\n\n- Использует CAS-операции.\n- `size()` — O(n), дорогая операция.\n- Не ограничена по размеру.\n\n**5. `ConcurrentLinkedDeque`** — lock-free двусторонняя очередь.\n\n**6. `BlockingQueue` (интерфейс) и реализации:**\n\n| Реализация | Особенность |\n|---|---|\n| `ArrayBlockingQueue` | Ограниченная, на массиве |\n| `LinkedBlockingQueue` | Опционально ограниченная, на связном списке |\n| `PriorityBlockingQueue` | Неограниченная, приоритетная |\n| `DelayQueue` | Элементы доступны после истечения задержки |\n| `SynchronousQueue` | Ёмкость 0: `put()` ждёт `take()` |\n| `LinkedTransferQueue` | `transfer()` ждёт, пока элемент будет потреблён |\n\n```java\nBlockingQueue\u003CString> queue = new ArrayBlockingQueue\u003C>(100);\nqueue.put(\"данные\");       \u002F\u002F блокирует, если заполнена\nString data = queue.take(); \u002F\u002F блокирует, если пуста\n```\n\n**7. `ConcurrentSkipListMap` и `ConcurrentSkipListSet`** — потокобезопасные отсортированные коллекции (аналоги `TreeMap`\u002F`TreeSet`). Все операции O(log n).\n\n**Сравнение подходов к потокобезопасности:**\n\n| Подход | Механизм | Пример |\n|---|---|---|\n| `synchronized` | Единый мьютекс | `Collections.synchronizedMap()` |\n| Сегментная блокировка | Блокировка части данных | `ConcurrentHashMap` (до Java 8) |\n| CAS + lock per bucket | Атомарные операции | `ConcurrentHashMap` (Java 8+) |\n| Copy-on-write | Копия при записи | `CopyOnWriteArrayList` |\n| Lock-free | Только CAS | `ConcurrentLinkedQueue` |\n\n**Частые ошибки:**\n- `CopyOnWriteArrayList` для часто изменяемых коллекций — каждая модификация копирует массив.\n- `if (!map.containsKey(key)) map.put(key, value)` — **не атомарно**! Используйте `putIfAbsent()`.\n- `size()` на `ConcurrentLinkedQueue` в цикле — O(n) на каждый вызов.\n- `null` в `ConcurrentHashMap` — запрещено, бросит `NullPointerException`.\n\n**Выбор коллекции:**\n\n| Сценарий | Коллекция |\n|---|---|\n| Потокобезопасная `Map` | `ConcurrentHashMap` |\n| Отсортированная `Map` | `ConcurrentSkipListMap` |\n| Много чтений, мало записей (список) | `CopyOnWriteArrayList` |\n| Producer-consumer (блокирующий) | `ArrayBlockingQueue` \u002F `LinkedBlockingQueue` |\n| Producer-consumer (неблокирующий) | `ConcurrentLinkedQueue` |\n\n> **На собеседовании** частый вопрос: «Почему `ConcurrentHashMap` не допускает `null`?» Ответ: в отличие от `HashMap`, где `null`-значение можно отличить от отсутствия ключа через `containsKey()`, в конкурентной среде между `containsKey()` и `get()` состояние может измениться, поэтому `null` создал бы неоднозначность.","","middle",[15,16,17,18,19,20],"BlockingQueue","коллекции","ConcurrentHashMap","ConcurrentLinkedQueue","CopyOnWriteArrayList","concurrency",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":31,"featuredSnippetReady":32},"Concurrent Collections в Java — ConcurrentHashMap, CopyOnWriteArrayList, BlockingQueue — Gymterview","Обзор потокобезопасных коллекций java.util.concurrent: ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, BlockingQueue и реализации, ConcurrentSkipListMap.","Concurrent Collections — потокобезопасные коллекции Java","ConcurrentHashMap (CAS-блокировка бакетов), CopyOnWriteArrayList (копирование при записи), BlockingQueue (блокирующая очередь) и другие.",[29,17,19,15,30],"Concurrent Collections Java","потокобезопасные коллекции","Основные: ConcurrentHashMap — CAS-блокировка на уровне бакетов, чтение без блокировки, null запрещён. CopyOnWriteArrayList — копирование массива при записи, идеально при преобладании чтений. ConcurrentLinkedQueue — lock-free очередь на CAS. BlockingQueue (ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue и др.) — блокирующие при пустой\u002Fполной очереди. ConcurrentSkipListMap\u002FSet — отсортированные concurrent-коллекции O(log n).",true]