> Какие примитивы синхронизации существуют кроме каналов в Go (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Wildberries, Black Wall Group (BWG), Фабрика решений

Стек: Go

> Пример ответа

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

  1. Mutex - взаимное исключение. Используется для защиты критических секций. Пример:

    GO
    var mu sync.Mutex
    mu.Lock()
    // работа с общими данными
    mu.Unlock()
  2. RWMutex - mutex с разделением на чтение и запись. Позволяет множеству горутин читать одновременно, но блокирует запись, пока есть читатели. Полезен для данных, которые часто читаются, но редко изменяются.

  3. WaitGroup - ожидание завершения группы горутин. Вызов Add(n) увеличивает счетчик, Done() уменьшает, Wait() блокирует до обнуления.

  4. Once - гарантирует однократное выполнение функции (например, для ленивой инициализации). Используется через Do(fn).

  5. Cond - условная переменная. Позволяет горутинам ждать наступления события и пробуждаться по сигналу (Broadcast или Signal). Часто комбинируется с Mutex.

  6. Atomic - атомарные операции из пакета sync/atomic (например, AddInt64, LoadPointer). Работают на уровне машинных инструкций, без блокировок.

Также стоит упомянуть sync.Map - потокобезопасную мапу, оптимизированную для сценариев с частым чтением и редкой записью.

Выбор примитива зависит от задачи: каналы хороши для передачи данных между горутинами, а Mutex/Atomic - для защиты общего состояния.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью