Mediumconcurrent-hashmap

Что такое ConcurrentHashMap?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

ConcurrentHashMap — потокобезопасная HashMap без блокирования всей карты. С Java 8: array of buckets, CAS для пустых, synchronized на первой ноде bucket-а при коллизях. Высокая параллельность при меньшем overhead.

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("a", 1);            // O(1) amortized, потокобезопасно
map.get("a");               // без блокировки
map.computeIfAbsent("b", k -> compute(k));  // атомарная вставка
map.forEach(1, (k, v) -> /* parallel bulk op */);
  • До Java 8 — segments (16), каждый свой lock;
  • size(), isEmpty() — weakly consistent, не блокируют;
  • Null keys/values не разрешены (в отличие от HashMap);
  • Лучше Collections.synchronizedMap: нет blocking всего map при операции;
  • Родственные: ConcurrentLinkedQueue, CopyOnWriteArrayList, ConcurrentSkipListMap.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.