Выбор ответа Middle Слайсы и мапы изнутри спрашивают часто обновлено
Конкурентная запись в map
Вопрос
Несколько горутин пишут в одну обычную мапу без синхронизации. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Гонка; рантайм может упасть с fatal error, recover не спасёт. Встроенная мапа не потокобезопасна.
Варианты ответа
- Ничего страшного: отдельные операции с мапой атомарны
- Гонка; рантайм может упасть с fatal error, recover не спасётправильный ответ
- Будет обычная panic: concurrent map writes, и её поймает recover
- Рантайм Go автоматически возьмёт блокировку на мапу
Разбор
Встроенная мапа не потокобезопасна. Рантайм делает дешёвую проверку флага записи и при обнаружении конкурентной записи вызывает fatal error, а это не panic: recover его не поймает, процесс завершится. Обнаружение не гарантировано, так что без синхронизации возможна и тихая порча данных. Решения: sync.Mutex/RWMutex вокруг мапы, sync.Map для подходящих сценариев, шардирование.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Слайсы и мапы изнутри»
- Разбить слайс на части по k на Go
- Удаление дубликатов с сохранением порядка на Go
- Группировка анаграмм на Go
- Циклический сдвиг слайса на Go
- Число подмассивов с суммой k на Go
- Топ-k частых слов на Go
- Что выведет Go: append при полной ёмкости
- Что выведет Go: два append в один подслайс