Конкурентный доступ к глобальной карте из горутин

После запуска писателя возникает data race, и runtime может аварийно завершить процесс с concurrent map read and map write. Гарантированной последовательности единиц и двоек нет.

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

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

После запуска писателя возникает data race, и runtime может аварийно завершить процесс с concurrent map read and map write. Гарантированной последовательности единиц и двоек нет.

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

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

Условие

В программе объявлена глобальная карта типа map[string]int, к которой одновременно обращаются несколько горутин – одна только читает, другая только пишет. Какой результат будет при запуске следующего кода?

package main

import (
    "fmt"
    "time"
)

var dataMap = 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(dataMap["a"])
    }
}

func writer() {
    for {
        dataMap["a"] = 2
    }
}

Ответ

После запуска писателя возникает data race, и runtime может аварийно завершить процесс с concurrent map read and map write. Гарантированной последовательности единиц и двоек нет.

Первый Sleep лишь откладывает запуск writer, второй не синхронизирует доступ к map. Защитите все чтения и записи одной блокировкой либо измените модель владения. Добавьте отмену бесконечных циклов и ожидание завершения вместо Sleep. Фатальная проверка runtime — возможное проявление гонки, а не гарантия её обнаружения в каждом запуске.

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

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

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

Подробнее