> Какие методы у мьютекса для блокировки на чтение и запись в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: МедиСофт
Стек: Go
> Пример ответа
В Go для мьютексов нет разделения на блокировку чтения и записи в одном типе. Вместо этого используются два разных примитива:
-
sync.Mutex- классический мьютекс с методамиLock()иUnlock(). Он не различает чтение и запись: любой горутине, вызвавшейLock(), придется ждать, пока мьютекс не освободится, независимо от типа операции. -
sync.RWMutex- мьютекс с разделением на чтение и запись. У него есть:RLock()/RUnlock()- для блокировки на чтение. Множество горутин могут одновременно удерживать блокировку чтения, если нет активной блокировки записи.Lock()/Unlock()- для блокировки на запись. Когда одна горутина удерживает блокировку записи, ни одна другая горутина не может получить ни блокировку чтения, ни блокировку записи.
Пример использования RWMutex:
GOvar mu sync.RWMutexvar data map[string]intfunc read(key string) int {mu.RLock()defer mu.RUnlock()return data[key]}func write(key string, value int) {mu.Lock()defer mu.Unlock()data[key] = value}
Таким образом, для блокировки на чтение используйте RLock(), на запись - Lock(). Это повышает производительность при большом количестве читателей.
> Похожие задачи по Go
Есть ли смысл объявлять мапу в конструкторе в Go вместо объявления переменной
Какие проблемы могут возникнуть при возвращении внутренней мапы напрямую в Go
Что такое condition variable в синхронизации
Как расположены ключи и значения в бакетах хэш-таблицы в Go?
> Похожие задачи по backend
Есть ли смысл объявлять мапу в конструкторе в Go вместо объявления переменной
Какие проблемы могут возникнуть при возвращении внутренней мапы напрямую в Go
Что такое condition variable в синхронизации
Как расположены ключи и значения в бакетах хэш-таблицы в Go?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью