Что верно про практическое применение виртуальных потоков?
Не пулить (поток на задачу), применять для блокирующего ввода-вывода, помнить, что ThreadLocal на миллионах потоков дорог, и ограничивать доступ к внешним ресурсам семафором — пул соединений к БД от виртуальных потоков не вырастет.
- Для CPU-bound выигрыша нет
- Executors.newVirtualThreadPerTaskExecutor()
- Spring Boot 3.2+: spring.threads.virtual.enabled=true
А ещё Ожидание на synchronized до JDK 24 закрепляло несущий поток
Подробно
Смысл виртуальных потоков в том, что блокировка перестаёт быть дорогой: поток отцепляется от несущего платформенного и не удерживает его. Отсюда: пул виртуальных потоков — антипаттерн, задача получает свой поток. Для вычислительных задач выигрыша нет — там по-прежнему упираются в ядра, и уместен обычный пул или Fork/Join. Важное предупреждение про масштаб: миллион потоков с ThreadLocal — это миллион копий значения. И отдельно стоит сказать вслух, что снятие ограничения на число потоков лишь передвигает узкое место дальше — в пул соединений к базе или в лимиты внешнего API, которые от этого шире не становятся.
Что хотят услышать
- Модель «поток на задачу».
- Где выигрыш и где нет.
- ThreadLocal и ограничение ресурсов.
Частые ошибки
- Заворачивать виртуальные потоки в пул «по привычке».
- Ожидать ускорения CPU-bound кода.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Их не пулят: виртуальный поток дёшев, создаётся под задачу и выбрасывается
- ✓Выигрыш дают IO-bound нагрузки; для CPU-bound задач они не ускоряют ничего
- ✓ThreadLocal при миллионах потоков перестаёт быть дешёвым и требует пересмотра
- ✗Они увеличивают пропускную способность внешних систем, к которым обращается сервис
Что спросят дальше
- Что такое pinning и когда он ещё возможен?
- Как structured concurrency меняет работу с группами задач?
Разбор темы
- Виртуальные потоки (Project Loom)
Лёгкие потоки JVM, монтирование на carrier, когда их применять, почему не пулят и проблема pinning.
Связанные вопросы
- Чем виртуальный поток отличается от обычного платформенного? Junior
- Что такое pinning виртуального потока и в каких случаях он всё ещё возможен в актуальных версиях Java? Senior
- Что происходит с виртуальным потоком, когда он выполняет блокирующий сетевой вызов? Middle
- В чём опасность ThreadLocal в пуле потоков? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.