Выбор ответа Senior Коллекции изнутри спрашивают часто обновлено
HashMap из нескольких потоков
Вопрос
Несколько потоков пишут в общий HashMap без синхронизации (Java 21). Что из этого реально может произойти?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Потеря записей и неконсистентное состояние таблицы, видимое другим потокам. HashMap не потокобезопасен: два put в одну корзину могут перезаписать друг друга, параллельный resize может потерять узлы, а без happens-before другие потоки могут видеть частично обновлённую структуру.
Варианты ответа
- Потеря записей и неконсистентное состояние таблицы, видимое другим потокамправильный ответ
- Гарантированный
ConcurrentModificationExceptionпри параллельномput - Ничего страшного:
putв HashMap атомарен на уровне JVM - JVM автоматически переключит HashMap в синхронизированный режим
Разбор
HashMap не потокобезопасен: два put в одну корзину могут перезаписать друг друга, параллельный resize может потерять узлы, а без happens-before другие потоки могут видеть частично обновлённую структуру. В Java 7 при resize ещё бывал бесконечный цикл. CME бросают итераторы при обнаружении изменения, это не защита от гонок и не гарантия. Автоматического переключения нет: нужен ConcurrentHashMap.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.