В чём разница между Mutex и RWMutex

«В чём разница между Mutex и RWMutex» — вопрос из категории Golang, который задают на 46% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Mutex (взаимное исключение) обеспечивает эксклюзивный доступ к ресурсу — только одна горутина может захватить блокировку для чтения или записи.

RWMutex (read-write mutex) разделяет доступ:

  • Множество горутин могут читать (RLock()), если нет блокировки на запись.
  • Только одна горутина может писать (Lock()), блокируя все остальные операции.

Пример:

var (
    mu  sync.Mutex
    rw  sync.RWMutex
    data int
)

// Mutex (любая операция блокирует)
mu.Lock()
data = 42 // запись
mu.Unlock()

// RWMutex (оптимизация для частого чтения)
rw.RLock()
_ = data // чтение (много горутин)
rw.RUnlock()

rw.Lock()
data = 100 // запись (эксклюзивно)
rw.Unlock()

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

  • Mutex — если операции записи частые или критическая секция небольшая.
  • RWMutex — если чтение происходит значительно чаще записи (например, кэш).