Sobes.tech
Back to questions
Middle+
2

Какие примитивы синхронизации есть в Go? В чем разница между Mutex и RWMutex? Когда использовать atomics?

Companies where asked
101ХР101ХР

Answer from AI

sobes.tech AI

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

  • Mutex (sync.Mutex) — простой мьютекс для взаимного исключения, блокирует доступ к ресурсу для всех остальных горутин.
  • RWMutex (sync.RWMutex) — расширенный мьютекс, который позволяет нескольким читателям одновременно держать блокировку, но запись эксклюзивна.
  • WaitGroup — для ожидания завершения группы горутин.
  • Cond — условная переменная для сигнализации между горутинами.
  • Atomic operations (пакет sync/atomic) — операции над переменными без блокировок, например, атомарное увеличение счетчика.

Разница между Mutex и RWMutex:

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

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

  • Для простых операций над примитивными типами (int, uint64, указатели), когда нужна высокая производительность и минимальная задержка.
  • Когда нужно избежать накладных расходов блокировок.
  • Например, для счетчиков, флагов или индикаторов состояния.

Пример использования Mutex и RWMutex:

var mu sync.Mutex
var rw sync.RWMutex

// Mutex
mu.Lock()
// критическая секция
mu.Unlock()

// RWMutex
rw.RLock() // для чтения
// чтение данных
rw.RUnlock()

rw.Lock() // для записи
// изменение данных
rw.Unlock()

Пример атомарного увеличения счетчика:

import "sync/atomic"

var counter int64

atomic.AddInt64(&counter, 1)