Что произойдет, в горутину с несколькими Reader придет блокирующий Writer

«Что произойдет, в горутину с несколькими Reader придет блокирующий Writer» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Если в горутину с несколькими Reader-ами (например, из sync.RWMutex) придет блокирующий Writer, произойдет следующее:

  1. Все текущие Reader-ы завершат работу (если они активны)
  2. Новые Reader-ы будут заблокированы до завершения Writer
  3. Writer получит эксклюзивный доступ и выполнит запись

Пример:

var mu sync.RWMutex

// Reader-ы работают параллельно
go func() {
    mu.RLock()
    defer mu.RUnlock()
    // чтение данных
}()

// Writer блокирует всех
go func() {
    mu.Lock()         // ждет завершения всех Reader-ов
    defer mu.Unlock()
    // запись данных
}()

Важно: если Reader-ы работают долго, Writer может надолго заблокировать всю систему. В таких случаях лучше использовать каналы или другие механизмы синхронизации.