Виртуальный поток обычно отцепляется от carrier thread, когда блокируется на операции ожидания. Но в некоторых ситуациях он может остаться привязанным к платформенному потоку — это называется pinning.
Классические причины:
🔘 блокирующая операция внутри synchronized;
🔘 выполнение native-кода через JNI.
Почему это важно?
Пока виртуальный поток pinned, carrier thread не может нормально использоваться для выполнения других виртуальных потоков.
🤔 А что с synchronized?
Начиная с Java 24, JVM изменила реализацию мониторов так, чтобы блокировка внутри synchronized больше не приводила к pinning виртуального потока в прежних сценариях.
Поэтому старый совет «везде заменить synchronized на ReentrantLock» уже неактуален.
🤩 А вот долгие блокирующие вызовы в native-коде всё ещё стоит учитывать при использовании виртуальных потоков.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта