Назад к вопросам
Ozon Финтех
Middle+
2
Какие средства синхронизации горутин есть в Go? Исправьте пример с гонкой используя atomic
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В Go для синхронизации горутин есть несколько средств:
- Мьютексы (
sync.Mutex) — для блокировки критических секций. - Каналы (
chan) — для коммуникации и синхронизации. - Пакет
sync/atomic— для атомарных операций над переменными. sync.WaitGroup— для ожидания завершения группы горутин.
Пример гонки и исправления с использованием atomic:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64 = 0
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt64(&counter, 1) // атомарное увеличение
}()
}
wg.Wait()
fmt.Println("Counter:", counter) // Ожидается 1000
}
В этом примере без atomic.AddInt64 была бы гонка при увеличении counter. Использование atomic гарантирует корректное обновление переменной без блокировок.