Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

Показать варианты и ответ
  • ✓Виртуальный поток не может отцепиться от несущего; после JEP 491 в JDK 24 synchronized больше не закрепляет, но нативные вызовы и Foreign Function & Memory API — по-прежнему
  • ✗Виртуальный поток навсегда привязывается к одному ядру процессора
  • ✗Pinning возникает при любом блокирующем вводе-выводе
  • ✗Pinning — это закрепление потока за конкретным ThreadLocal

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем