Что такое Thread Starvation в Java?

«Что такое Thread Starvation в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Thread Starvation (Голодание потока) — это ситуация, когда поток не может прогрессировать, потому что ему постоянно не хватает доступа к общим ресурсам (CPU, блокировкам), которые монополизированы другими потоками.

Распространенные причины:

  1. Некорректные приоритеты: Потоки с низким приоритетом постоянно вытесняются высокоприоритетными.
  2. Длинные критические секции: Поток надолго захватывает монитор (synchronized) или Lock, не давая другим потокам войти.
  3. Несправедливые (non-fair) блокировки: Некоторые реализации Lock могут отдавать предпочтение уже ожидающим потокам, а не новым.

Пример проблемы:

// Долгая операция в synchronized-блоке
synchronized(sharedResource) {
    readHugeFile(); // Другие потоки ждут всё это время
    processData();
}

Способы предотвращения:

  • Уменьшайте время удержания блокировок. Выполняйте в критической секции только необходимые операции.
  • Используйте Lock с таймаутом: lock.tryLock(100, TimeUnit.MILLISECONDS).
  • Применяйте "честные" (fair) блокировки: new ReentrantLock(true). Это может снизить общую пропускную способность, но обеспечит справедливость.
  • Настройте пулы потоков адекватно нагрузке.