Ответ
Deadlock — это ситуация, когда две или более горутины блокируют друг друга, ожидая освобождения ресурса, который удерживает другая. Это приводит к бесконечному ожиданию.
Пример:
package main
import (
"sync"
"time"
)
func main() {
var mu1, mu2 sync.Mutex
go func() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(100 * time.Millisecond)
mu2.Lock() // Ждёт mu2, но её удерживает другая горутина
defer mu2.Unlock()
}()
go func() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(100 * time.Millisecond)
mu1.Lock() // Ждёт mu1, но её удерживает первая горутина
defer mu1.Unlock()
}()
time.Sleep(1 * time.Second) // Даём горутинам время на deadlock
}
Как избежать:
- Упорядочивать захват мьютексов (например, всегда сначала
mu1, потомmu2). - Использовать
sync.RWMutexили каналы. - Применять таймауты (
TryLock,selectсtime.After).