> Для чего нужен sync.RWMutex и когда его использовать в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Employcity
Стек: Go
> Пример ответа
sync.RWMutex - это блокировка с разделяемым доступом на чтение и монопольным на запись. В отличие от обычного sync.Mutex, который блокирует все горутины независимо от типа операции, RWMutex позволяет множеству горутин одновременно читать защищённые данные, но блокирует всех читателей, когда одна горутина пишет.
Использовать sync.RWMutex стоит в сценариях, где:
- Чтение данных происходит значительно чаще, чем запись (например, кэш, конфигурация, таблицы маршрутизации).
- Критическая секция не слишком мала - накладные расходы на
RWMutexвыше, чем уMutex, поэтому для коротких операций (вроде инкремента счётчика) он неэффективен. - Важно не блокировать читателей без необходимости -
RWMutexповышает параллелизм чтения.
Пример типичного использования:
GOtype Cache struct {mu sync.RWMutexdata 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, блокируя всех при записи.
> Похожие задачи по Go
Что такое кардинальность колонок и зачем это знать
Можно ли отключить или ограничить запуск сборщика мусора в Go
Где размещается большая переменная с миллионами элементов в Go
Как определяется, куда положить переменную в памяти, и кто это определяет
> Похожие задачи по backend
Что такое кардинальность колонок и зачем это знать
Можно ли отключить или ограничить запуск сборщика мусора в Go
Где размещается большая переменная с миллионами элементов в Go
Как определяется, куда положить переменную в памяти, и кто это определяет
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью