Ответ
Если после RWMutex поставить обычный Mutex, это может привести к взаимоблокировке (deadlock) в определенных сценариях.
Пример:
var (
rwMu sync.RWMutex
mu sync.Mutex
)
func example() {
rwMu.RLock() // Захватываем read lock
defer rwMu.RUnlock()
mu.Lock() // Блокируемся, если кто-то уже держит mu
defer mu.Unlock()
// Критическая секция
}
Проблема:
Если другая горутина сначала захватит mu, а затем попытается взять rwMu.Lock() (на запись), возникнет deadlock:
- Горутина 1:
RLock()→ ждётmu - Горутина 2:
mu.Lock()→ ждётLock()наRWMutex(который не даст его, пока есть ридеры).
Вывод:
Порядок блокировок должен быть согласованным, иначе возможна взаимоблокировка. Лучше избегать смешивания RWMutex и Mutex без четкой стратегии.