Ответ
Если в горутину с несколькими Reader-ами (например, из sync.RWMutex) придет блокирующий Writer, произойдет следующее:
- Все текущие
Reader-ы завершат работу (если они активны) - Новые
Reader-ы будут заблокированы до завершенияWriter-а Writerполучит эксклюзивный доступ и выполнит запись
Пример:
var mu sync.RWMutex
// Reader-ы работают параллельно
go func() {
mu.RLock()
defer mu.RUnlock()
// чтение данных
}()
// Writer блокирует всех
go func() {
mu.Lock() // ждет завершения всех Reader-ов
defer mu.Unlock()
// запись данных
}()
Важно: если Reader-ы работают долго, Writer может надолго заблокировать всю систему. В таких случаях лучше использовать каналы или другие механизмы синхронизации.