Ответ
В Go есть два основных вида мьютексов из пакета sync:
- Mutex - обычная блокировка с двумя состояниями (заблокирован/разблокирован).
var mu sync.Mutex
mu.Lock()
// критическая секция
mu.Unlock()
- RWMutex - читатель-писатель. Множество горутин может читать (
RLock()), но только одна - писать (Lock()).
var rw sync.RWMutex
rw.RLock() // для чтения
// чтение данных
rw.RUnlock()
rw.Lock() // для записи
// изменение данных
rw.Unlock()
Разница:
Mutexблокирует полностью, даже для чтения.RWMutexэффективнее, когда много читателей и редкие записи.
⚠️ Важно избегать deadlock и всегда разблокировать мьютекс (можно использовать defer).