> Для чего нужен sync.RWMutex и когда его использовать в Go (Go)

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

Компании: Employcity

Стек: Go

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

sync.RWMutex - это блокировка с разделяемым доступом на чтение и монопольным на запись. В отличие от обычного sync.Mutex, который блокирует все горутины независимо от типа операции, RWMutex позволяет множеству горутин одновременно читать защищённые данные, но блокирует всех читателей, когда одна горутина пишет.

Использовать sync.RWMutex стоит в сценариях, где:

  • Чтение данных происходит значительно чаще, чем запись (например, кэш, конфигурация, таблицы маршрутизации).
  • Критическая секция не слишком мала - накладные расходы на RWMutex выше, чем у Mutex, поэтому для коротких операций (вроде инкремента счётчика) он неэффективен.
  • Важно не блокировать читателей без необходимости - RWMutex повышает параллелизм чтения.

Пример типичного использования:

GO
type Cache struct {
mu sync.RWMutex
data map[string]string
}
func (c *Cache) Get(key string) (string, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
val, ok := c.data[key]
return val, ok
}
func (c *Cache) Set(key, value string) {
c.mu.Lock()
defer c.mu.Unlock()
c.data[key] = value
}

Здесь Get использует RLock/RUnlock, позволяя множеству горутин одновременно читать, а Set - Lock/Unlock, блокируя всех при записи.

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

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