У программы data race: несколько горутин записывают общую map без синхронизации. Нельзя гарантировать ни true/false, ни успешное завершение.
Конкурентный доступ к карте и возможные гонки
У программы data race: несколько горутин записывают общую map без синхронизации. Нельзя гарантировать ни true/false, ни успешное завершение.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет напечатан при выполнении приведённого ниже фрагмента программы?
package main
import (
"fmt"
"time"
)
func main() {
mp := make(map[int]bool)
go func() {
mp[1] = true
}()
go func() {
mp[1] = true
}()
go func() {
mp[1] = false
}()
time.Sleep(1 * time.Second)
fmt.Printf("%v", mp[1])
}
Ответ
У программы data race: несколько горутин записывают общую map без синхронизации. Нельзя гарантировать ни true/false, ни успешное завершение.
Обычная map не поддерживает несогласованные конкурентные записи даже в одинаковый ключ. Возможен аварийный вывод runtime о concurrent map writes; Sleep не исправляет нарушение и не является ожиданием по контракту.
Используйте один mutex для всех обращений и WaitGroup для завершения работников. После этого true или false зависит от последней записи; если необходим детерминированный итог, задайте явный порядок. Для одной булевой переменной сама map может быть избыточной, но выбор atomic также не устанавливает порядок разных писателей.