Определение результата конкурентной записи в одну ячейку map

Корректного предсказуемого результата нет: конкурентные записи в обычную map создают data race и могут аварийно завершить программу.

Короткий ответ

Что ответить на собеседовании

Корректного предсказуемого результата нет: конкурентные записи в обычную map создают data race и могут аварийно завершить программу.

Подробный разбор

Ответ с пояснениями

Условие

Нужно понять, какое значение окажется в ячейке отображения после того, как несколько горутин одновременно попытаются записать в неё разные числа.

m := make(map[int]int, 1)
go func() { m[1] = 2 }()
go func() { m[1] = 7 }()
go func() { m[1] = 10 }()

time.Sleep(100 * time.Millisecond)
fmt.Println("m[1] =", m[1])

Ответ

Корректного предсказуемого результата нет: конкурентные записи в обычную map создают data race и могут аварийно завершить программу.

Даже запись в один и тот же ключ требует синхронизации. Sleep не образует отношения happens-before и не делает последующее чтение безопасным; возможны и диагностические ошибки concurrent map writes.

Защитите все чтения и записи mutex и дождитесь работников через WaitGroup. Тогда значение будет одним из записанных, но без установленного порядка нельзя заранее выбрать 2, 7 или 10. Если нужен конкретный победитель, порядок или приоритет необходимо описать явно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее