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"))
}