Sobes.tech
Назад к вопросам
Senior
4

Mutex или каналы — в каком случае что использовать?

Компании, где спрашивали
Финтехробот

Ответ от нейросети

sobes.tech AI

Mutex и каналы в Go служат для разных целей синхронизации и коммуникации между горутинами.

  • Mutex (sync.Mutex) — используется для защиты общих данных от одновременного доступа. Если у вас есть разделяемое состояние (например, переменная, срез, карта), и вы хотите избежать гонок данных, применяйте мьютекс. Он блокирует доступ к ресурсу, пока одна горутина его использует.

  • Каналы (chan) — предназначены для передачи данных между горутинами и организации коммуникации. Они позволяют передавать значения, обеспечивая синхронизацию без явного блокирования состояния.

Когда что использовать:

  • Если задача сводится к защите доступа к разделяемому состоянию — используйте мьютекс.
  • Если нужно организовать передачу сообщений или событий между горутинами — используйте каналы.

Пример с mutex:

var mu sync.Mutex
var counter int

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

Пример с каналом:

ch := make(chan int)

// Отправка
go func() {
    ch <- 42
}()

// Получение
val := <-ch
fmt.Println(val) // 42

В целом, каналы лучше подходят для передачи данных и построения конвейеров, а мьютексы — для защиты состояния. Иногда их комбинируют для решения сложных задач.