ConcurrentHashMap
Потокобезопасный словарь для одновременной работы из многих потоков.
Доступно с: Java 1.5
Синтаксис
public class ConcurrentHashMap<K, V> implements ConcurrentMap<K, V>Примеры
Подсчёт слов из нескольких потоков:
void main() {
var counts = new ConcurrentHashMap<String, Integer>();
List<String> words = List.of("a", "b", "a", "c", "a", "b");
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int round = 0; round < 100; round++) {
for (String w : words) {
executor.submit(() -> counts.merge(w, 1, Integer::sum));
}
}
}
IO.println(new TreeMap<>(counts));
}Результат:
{a=300, b=200, c=100}Примечания
Отдельные методы безопасны, а составные операции нужно делать одним атомарным вызовом: merge(), compute(), computeIfAbsent(), putIfAbsent(). Пара get() + put() из разных потоков теряет обновления. Ключи и значения null запрещены.
См. также
- HashMap — Словарь на основе хеш-таблицы: быстрый поиск по ключу, порядок не гарантирован.
- Map.merge() — Добавляет значение по ключу или объединяет его с уже существующим.
- AtomicInteger — Целое число, которое можно безопасно менять из нескольких потоков без блокировок.
Вопросы и ответы по теме
В учебнике
- Потокобезопасные коллекции — Коллекции для многопоточного кода в Java — ConcurrentHashMap и merge, CopyOnWriteArrayList, BlockingQueue и схема производитель — потребитель.