Выбор ответа Senior Коллекции изнутри спрашивают часто обновлено

HashMap из нескольких потоков

Вопрос

Несколько потоков пишут в общий HashMap без синхронизации (Java 21). Что из этого реально может произойти?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Потеря записей и неконсистентное состояние таблицы, видимое другим потокам. HashMap не потокобезопасен: два put в одну корзину могут перезаписать друг друга, параллельный resize может потерять узлы, а без happens-before другие потоки могут видеть частично обновлённую структуру.

Варианты ответа

  1. Потеря записей и неконсистентное состояние таблицы, видимое другим потокамправильный ответ
  2. Гарантированный ConcurrentModificationException при параллельном put
  3. Ничего страшного: put в HashMap атомарен на уровне JVM
  4. JVM автоматически переключит HashMap в синхронизированный режим

Разбор

HashMap не потокобезопасен: два put в одну корзину могут перезаписать друг друга, параллельный resize может потерять узлы, а без happens-before другие потоки могут видеть частично обновлённую структуру. В Java 7 при resize ещё бывал бесконечный цикл. CME бросают итераторы при обнаружении изменения, это не защита от гонок и не гарантия. Автоматического переключения нет: нужен ConcurrentHashMap.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме