Starvation (голодание) - горутина формально может получить ресурс, но на практике другие горутины постоянно забирают его первыми:
var mu sync.Mutex
// Горутина A: часто захватывает и быстро отпускает
go func() {
for {
mu.Lock()
doQuickWork() // 1ms
mu.Unlock()
// сразу снова Lock - высокий шанс успеха
}
}()
// Горутина B: редко получает мьютекс (starvation)
go func() {
mu.Lock() // может ждать очень долго
doSlowWork() // 100ms
mu.Unlock()
}()
Отличия от deadlock и livelock:
Решения:
sync.Mutex в Go использует fair scheduling (чередование) с Go 1.9+: после 1ms ожидания мьютекс переходит в starvation mode и отдается следующему в очереди