Одновременное несогласованное чтение и запись обычной map недопустимы: это data race, возможен fatal error concurrent map read and map write.
Одновременное чтение и запись в map в Go
Одновременное несогласованное чтение и запись обычной map недопустимы: это data race, возможен fatal error concurrent map read and map write.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что происходит, если из разных горутин одновременно выполнять операции чтения и записи в map? Появятся ли ошибки, и существуют ли какие‑либо ограничения?
var data = map[string]int{"a": 1}
func main() {
go reader()
time.Sleep(1 * time.Second)
go writer()
time.Sleep(1 * time.Second)
}
func reader() {
for {
fmt.Println(data["a"])
}
}
func writer() {
for {
data["a"] = 2
}
}
Ответ
Одновременное несогласованное чтение и запись обычной map недопустимы: это data race, возможен fatal error concurrent map read and map write.
Sleep лишь откладывает запуск writer и не защищает reader после его старта. Даже один постоянно перезаписываемый ключ требует синхронизации; авария не обязана проявляться в каждом запуске.
Используйте один RWMutex для обеих сторон, sync.Map под подходящий сценарий либо единственную горутину-владельца. Несколько читателей безопасны, если map больше никто не меняет и её публикация синхронизирована. Бесконечные циклы также нуждаются в управляемом завершении, а печать на каждой итерации создаёт ненужную нагрузку.