> Какие методы у мьютекса для блокировки на чтение и запись в Go (Go)

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

Компании: МедиСофт

Стек: Go

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

В Go для мьютексов нет разделения на блокировку чтения и записи в одном типе. Вместо этого используются два разных примитива:

  1. sync.Mutex - классический мьютекс с методами Lock() и Unlock(). Он не различает чтение и запись: любой горутине, вызвавшей Lock(), придется ждать, пока мьютекс не освободится, независимо от типа операции.

  2. sync.RWMutex - мьютекс с разделением на чтение и запись. У него есть:

    • RLock() / RUnlock() - для блокировки на чтение. Множество горутин могут одновременно удерживать блокировку чтения, если нет активной блокировки записи.
    • Lock() / Unlock() - для блокировки на запись. Когда одна горутина удерживает блокировку записи, ни одна другая горутина не может получить ни блокировку чтения, ни блокировку записи.

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

GO
var mu sync.RWMutex
var data map[string]int
func 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(). Это повышает производительность при большом количестве читателей.

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

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