Выбор ответа Middle Слайсы и мапы изнутри спрашивают часто обновлено

Конкурентная запись в map

Вопрос

Несколько горутин пишут в одну обычную мапу без синхронизации. Что произойдёт?

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

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

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

Коротко

Правильный ответ: Гонка; рантайм может упасть с fatal error, recover не спасёт. Встроенная мапа не потокобезопасна.

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

  1. Ничего страшного: отдельные операции с мапой атомарны
  2. Гонка; рантайм может упасть с fatal error, recover не спасётправильный ответ
  3. Будет обычная panic: concurrent map writes, и её поймает recover
  4. Рантайм Go автоматически возьмёт блокировку на мапу

Разбор

Встроенная мапа не потокобезопасна. Рантайм делает дешёвую проверку флага записи и при обнаружении конкурентной записи вызывает fatal error, а это не panic: recover его не поймает, процесс завершится. Обнаружение не гарантировано, так что без синхронизации возможна и тихая порча данных. Решения: sync.Mutex/RWMutex вокруг мапы, sync.Map для подходящих сценариев, шардирование.

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

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