> Нужно ли использовать мьютексы для синхронизации при работе с каналами и горутинами в Go (Go)

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

Компании: Ozon

Стек: Go

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

В Go каналы сами по себе потокобезопасны - отправка и получение данных через канал не требует дополнительных мьютексов. Однако мьютексы могут понадобиться в следующих случаях:

  1. Защита разделяемого состояния - если несколько горутин одновременно читают/пишут в общую структуру данных (например, map, срез), а каналы используются только для сигнализации, мьютекс обязателен.

  2. Атомарные операции над сложными структурами - когда нужно гарантировать целостность нескольких полей объекта при конкурентном доступе.

  3. Синхронизация доступа к ресурсам вне Go - например, к файлам, сетевым соединениям или БД.

Пример с мьютексом:

GO
type SafeCounter struct {
mu sync.Mutex
v map[string]int
}
func (c *SafeCounter) Inc(key string) {
c.mu.Lock()
defer c.mu.Unlock()
c.v[key]++
}

Но если вы строите архитектуру на каналах (fan-in, fan-out, pipeline), мьютексы обычно не нужны - каналы и горутины обеспечивают безопасную передачу данных. Выбирайте между ними по принципу: каналы для передачи владения данными, мьютексы для защиты общего состояния.

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

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