Материал проходит вычитку — возможны неточности.
Урок 88 из 118

RWMutex

После починки счётчиков выяснилось: статистику читали десятки воркеров, а обновлял один шаг — и редко. Миша разделил доступ: чтения шли параллельно, запись осталась одна. Сергей прогнал стенд — очередь на чтение исчезла.

Главная мысль

RWMutex различает чтение и запись: много читателей работают одновременно, писатель — в одиночку; а когда писатель ждёт, новые читатели встают в очередь за ним.

Читатели параллельны, писатель один

type Meta struct {
    mu sync.RWMutex
    m  map[string]string
}

func (c *Meta) Get(k string) string {
    c.mu.RLock()         // разделяемая блокировка
    defer c.mu.RUnlock()
    return c.m[k]
}

func (c *Meta) Set(k, v string) {
    c.mu.Lock()          // исключительная
    defer c.mu.Unlock()
    c.m[k] = v
}

RLock — блокировка на чтение: её могут взять много горутин одновременно. Lock — на запись: она исключительная, ждёт, пока все читатели выйдут. Чтение не меняет данные, поэтому читателям незачем сериализоваться.

Писатель не голодает

Менее очевидное поведение: пока писатель ждёт своей очереди, новые читатели не проходят — иначе при плотном потоке чтений писатель голодал бы вечно. В документации это зафиксировано прямо: если вызван Lock, последующие RLock встанут в очередь за ним. Поэтому всплеск чтений на RWMutex не бесплатен, даже когда данные никто не меняет.

Когда RWMutex оправдан

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

В следующем уроке

Вы узнаете:

  • почему вложенный RLock в одной горутине может заблокироваться
  • как бенчмарк сравнивает Mutex и RWMutex под разным профилем
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Голодает ли писатель при плотном потоке чтений на RWMutex?

Вопрос 2 из 3

Повторный RLock в той же горутине — чем опасен?

Вопрос 3 из 3

Когда RWMutex оправдан вместо Mutex?

Итоги

RWMutex: RLock для параллельного чтения, Lock для исключительной записи; очередь писателя защищает его от голодания.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки