Hardconcurrent-hashmap
Что такое ConcurrentHashMap (внутреннее устройство)?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
ConcurrentHashMap — потокобезопасная HashMap без блокирования всего map. Чтение всегда без блокировок (volatile read таблицы и узлов).
До Java 8: Segment[16], каждый segment — своя HashMap + lock
параллелизм = число segments
С Java 8: Node[] table (как HashMap)
- пустой бакет → CAS
- непустой бакет → synchronized на first node
- treeify при длине цепочки >= 8 (TreeBin)ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.computeIfAbsent("k", k -> load(k)); // атомарно
map.merge("k", 1, Integer::sum); // атомарный счётчик
map.forEach(1, (k, v) -> /* parallel, threshold=1 */);size()— суммированиеbaseCount + CounterCell[](striped64), приблизительное;- Null ключи/значения запрещены (ambiguous в concurrency);
- Итератор weakly consistent, не бросает CME;
- Лучше
synchronizedMap: не блокирует весь map.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.