Sobes.tech
Back to questions
Middle+
1

Какие средства синхронизации горутин есть в Go? Исправьте пример с гонкой используя atomic

Companies where asked
Ozon ФинтехOzon Финтех

Answer from AI

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 гарантирует корректное обновление переменной без блокировок.