Конкурентный доступ к карте и возможные гонки

У программы 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 также не устанавливает порядок разных писателей.

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

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

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

Подробнее