Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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 и схема производитель — потребитель.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.