Какие знаешь примитивы синхронизации

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

Ответ

В Go есть несколько примитивов синхронизации из пакета sync:

  1. Mutex (sync.Mutex) - блокирует доступ к общему ресурсу:
var mu sync.Mutex
mu.Lock()
// критическая секция
mu.Unlock()
  1. RWMutex (sync.RWMutex) - позволяет множественное чтение, но эксклюзивную запись:
var rw sync.RWMutex
rw.RLock() // для чтения
rw.Lock()  // для записи
  1. WaitGroup (sync.WaitGroup) - ожидание завершения группы горутин:
var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    // работа
}()
wg.Wait()
  1. Once (sync.Once) - гарантирует однократное выполнение:
var once sync.Once
once.Do(func() { /* инициализация */ })
  1. Cond (sync.Cond) - условные переменные для ожидания событий.

  2. Atomic операции (sync/atomic) - атомарные операции с числами.

Также есть каналы (chan), которые являются основным средством коммуникации между горутинами в Go.