🟡 Средний · 2 очк. Горутины и конкурентность
Что такое starvation (голодание) в контексте конкурентности Go?
A Нехватка оперативной памяти
B Ситуация, когда горутина не может получить доступ к ресурсу, потому что другие горутины постоянно его захватывают первыми
C Завершение горутины из-за таймаута
D Ошибка при чтении из пустого канала
Объяснение вопроса

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:

  • Deadlock: все заблокированы навсегда
  • Livelock: все активны, но без прогресса
  • Starvation: часть горутин работает нормально, другие "голодают"

Решения:

  • sync.Mutex в Go использует fair scheduling (чередование) с Go 1.9+: после 1ms ожидания мьютекс переходит в starvation mode и отдается следующему в очереди
  • Использовать каналы с буфером или worker pool для распределения нагрузки
  • Ограничить частоту Lock/Unlock (batch обработка)
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.