Sobes.tech
Junior — Senior
46

Гонки данных в небезопасном счётчике

Условие задачи

В примере реализован простой счётчик, который предполагается использовать в многопоточной среде, однако доступ к общей структуре происходит без какой‑либо синхронизации. Нужно понять, какие ошибки возникают при одновременных вызовах методов и как правильно защитить внутреннее состояние от race‑condition.

type SafeCounter struct {
    values map[string]int
}

func (ctr *SafeCounter) Inc(key string) {
    ctr.values[key]++
}

func (ctr *SafeCounter) Value(key string) int {
    return ctr.values[key]
}

func main() {
    counter := SafeCounter{values: make(map[string]int)}
    for i := 0; i < 1000; i++ {
        go counter.Inc("somekey")
    }

    time.Sleep(time.Second)
    fmt.Println(counter.Value("somekey"))
}