Вопрос с собеседования · Java

Что такое pinning виртуального потока и в каких случаях он всё ещё возможен в актуальных версиях Java?

SeniorМногопоточностьJava >=21
Коротко

Pinning — виртуальный поток при блокировке не может отцепиться от несущего, и тот простаивает. До JDK 24 главная причина — блокировка внутри synchronized; JEP 491 (JDK 24) это убрал. Остаются нативные кадры (JNI, вызовы через Foreign API) в стеке.

  • На JDK 21 — заменять synchronized вокруг ввода-вывода на ReentrantLock
  • Найти: событие JFR jdk.VirtualThreadPinned
  • Несущих потоков по числу ядер — несколько закреплённых могут встать всем

А ещё Короткий synchronized без блокировок — не проблема

Подробно

Обычно виртуальный поток при блокировке отцепляется от несущего платформенного, освобождая его для других задач. Pinning — ситуация, когда отцепиться нельзя, и платформенный поток простаивает вместе с виртуальным; при малом пуле несущих потоков это способно застопорить приложение. Исторически главной причиной был synchronized, из-за чего рекомендовали заменять его на ReentrantLock. JEP 491 в JDK 24 это исправил: владение монитором теперь отслеживается по виртуальному потоку. Остались нативные методы и Foreign Function & Memory API. Знание того, что рекомендация про ReentrantLock устарела, хорошо отличает актуальные знания от прочитанных пару лет назад.

Что хотят услышать

  • Что такое pinning и почему опасен.
  • Изменения в JDK 24.
  • Как найти и обойти.

Частые ошибки

  • Повторять устаревший совет «замените synchronized на ReentrantLock ради виртуальных потоков» без оговорки о версии.
  • Путать pinning с привязкой к ядру процессора.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Виртуальный поток навсегда привязывается к одному ядру процессора
  • ✗Pinning возникает при любом блокирующем вводе-выводе
  • ✗Pinning — закрепление за несущим; в JDK 24 его вызывает только synchronized
  • ✓Поток не может отцепиться от несущего; в JDK 24+ — из-за нативных вызовов и FFM

Что спросят дальше

  • Как обнаружить pinning в работающем приложении?
  • Почему при pinning важен размер пула несущих потоков?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования