Что такое pinning виртуального потока и в каких случаях он всё ещё возможен в актуальных версиях Java?
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 важен размер пула несущих потоков?
Разбор темы
- Виртуальные потоки (Project Loom)
Лёгкие потоки JVM, монтирование на carrier, когда их применять, почему не пулят и проблема pinning.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.