> Какие примитивы синхронизации существуют кроме каналов в Go (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries, Black Wall Group (BWG), Фабрика решений
Стек: Go
> Пример ответа
В Go помимо каналов существует несколько примитивов синхронизации из пакета sync:
-
Mutex - взаимное исключение. Используется для защиты критических секций. Пример:
GOvar mu sync.Mutexmu.Lock()// работа с общими даннымиmu.Unlock() -
RWMutex - mutex с разделением на чтение и запись. Позволяет множеству горутин читать одновременно, но блокирует запись, пока есть читатели. Полезен для данных, которые часто читаются, но редко изменяются.
-
WaitGroup - ожидание завершения группы горутин. Вызов
Add(n)увеличивает счетчик,Done()уменьшает,Wait()блокирует до обнуления. -
Once - гарантирует однократное выполнение функции (например, для ленивой инициализации). Используется через
Do(fn). -
Cond - условная переменная. Позволяет горутинам ждать наступления события и пробуждаться по сигналу (
BroadcastилиSignal). Часто комбинируется с Mutex. -
Atomic - атомарные операции из пакета
sync/atomic(например,AddInt64,LoadPointer). Работают на уровне машинных инструкций, без блокировок.
Также стоит упомянуть sync.Map - потокобезопасную мапу, оптимизированную для сценариев с частым чтением и редкой записью.
Выбор примитива зависит от задачи: каналы хороши для передачи данных между горутинами, а Mutex/Atomic - для защиты общего состояния.
> Похожие задачи по backend
Какие средства синхронизации кроме мьютексов используются в Go
Как планировщик Go распределяет goroutine между потоками
В чем разница реляционных, NoSQL и колоночных баз данных
В чем разница между виртуализацией и контейнеризацией
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью