Ключевые правила:
1. Всегда defer Unlock — иначе при панике мьютекс останется заблокированным
mu.Lock()
defer mu.Unlock()
2. Не копировать мьютекс — sync.Mutex нельзя передавать по значению, только по указателю
3. Минимизировать critical section — держать Lock как можно меньше
4. Не вызывать Lock рекурсивно — Go мьютексы не reentrant, будет дедлок
5. RWMutex для read-heavy нагрузки — множество читателей параллельно, один писатель
6. Одинаковый порядок блокировки — если нужно два мьютекса, всегда блокировать в одном порядке, иначе дедлок
7. go vet / race detector — go test -race находит data races на этапе тестирования