Состояние гонки в несинхронизированном счетчике
Условие задачи
Реализован счетчик, который должен быть потокобезопасным, но используется без синхронизации доступа к общему ресурсу. Необходимо выяснить, в чем заключается проблема при параллельном использовании, и предложить способ корректной защиты данных от гонок
gotype SafeCounter struct {
v map[string]int
}
func (c *SafeCounter) Inc(key string) {
c.v[key]++
}
func (c *SafeCounter) Value(key string) int {
return c.v[key]
}
func main() {
c := SafeCounter{v: make(map[string]int)}
for i := 0; i < 1000; i++ {
go c.Inc("somekey")
}
time.Sleep(time.Second)
fmt.Println(c.Value("somekey"))
}