Как бороться с состоянием гонки (Race condition) в многопоточности

«Как бороться с состоянием гонки (Race condition) в многопоточности» — вопрос из категории Golang, который задают на 24% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте примитивы синхронизации из пакета sync:

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

Основные способы:

  1. Мьютексы (sync.Mutex) - блокируют доступ к общим данным
  2. RWMutex - для сценариев "много читателей, один писатель"
  3. Атомарные операции (sync/atomic)
  4. Каналы - для передачи данных между горутинами

Пример с атомарными операциями:

var counter int64

func increment() {
    atomic.AddInt64(&counter, 1)
}

Лучшая практика - минимизировать общее состояние, использовать каналы и immutable структуры там, где возможно. Для обнаружения race conditions используйте go run -race.