Ответ
Thread Starvation (Голодание потока) — это ситуация, когда поток не может прогрессировать, потому что ему постоянно не хватает доступа к общим ресурсам (CPU, блокировкам), которые монополизированы другими потоками.
Распространенные причины:
- Некорректные приоритеты: Потоки с низким приоритетом постоянно вытесняются высокоприоритетными.
- Длинные критические секции: Поток надолго захватывает монитор (
synchronized) илиLock, не давая другим потокам войти. - Несправедливые (non-fair) блокировки: Некоторые реализации
Lockмогут отдавать предпочтение уже ожидающим потокам, а не новым.
Пример проблемы:
// Долгая операция в synchronized-блоке
synchronized(sharedResource) {
readHugeFile(); // Другие потоки ждут всё это время
processData();
}
Способы предотвращения:
- Уменьшайте время удержания блокировок. Выполняйте в критической секции только необходимые операции.
- Используйте
Lockс таймаутом:lock.tryLock(100, TimeUnit.MILLISECONDS). - Применяйте "честные" (fair) блокировки:
new ReentrantLock(true). Это может снизить общую пропускную способность, но обеспечит справедливость. - Настройте пулы потоков адекватно нагрузке.