[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-sovremennaya-razrabotka-web-chto-takoe-virtual-threads-i-kak-oni-menyayut-razrabotku":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},1195,"chto-takoe-virtual-threads-i-kak-oni-menyayut-razrabotku",37,"sovremennaya-razrabotka-web","Современная разработка WEB","🌐","Что такое Virtual Threads и как они меняют разработку?","Virtual Threads (Project Loom, Java 21) — легковесные потоки, управляемые JVM, которые позволяют использовать простой синхронный код с масштабируемостью реактивного стека.\n\n> Аналогия из жизни: обычные (platform) потоки — это дорогие сотрудники, которых можно нанять ограниченное количество. Virtual Threads — это волонтёры: их может быть миллион, и они \"спят\", пока ждут ответа, не потребляя ресурсов.\n\n### Включение в Spring Boot\n\n```yaml\nspring:\n  threads:\n    virtual:\n      enabled: true\n```\n\nОдна строка — и все HTTP-обработчики, Kafka listeners, scheduled tasks переключаются на виртуальные потоки.\n\n### До и после Virtual Threads\n\n```java\n\u002F\u002F До: реактивный стек для масштабируемости\npublic Mono\u003COrder> getOrder(UUID id) {\n    return orderRepository.findById(id)\n        .switchIfEmpty(Mono.error(new OrderNotFoundException(id)))\n        .flatMap(order -> enrichWithCustomer(order));\n}\n\n\u002F\u002F После: простой синхронный код с той же масштабируемостью\npublic Order getOrder(UUID id) {\n    Order order = orderRepository.findById(id)\n        .orElseThrow(() -> new OrderNotFoundException(id));\n    return enrichWithCustomer(order);\n}\n```\n\n### Structured Concurrency (Java 24+)\n\n```java\ntry (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n    Subtask\u003CUser> userTask = scope.fork(() -> findUser(userId));\n    Subtask\u003COrder> orderTask = scope.fork(() -> findOrder(orderId));\n    scope.join().throwIfFailed();\n    return new UserOrder(userTask.get(), orderTask.get());\n}\n```\n\n### Частые ошибки\n\n- Блокирующие операции (synchronized) на виртуальных потоках: pinning виртуального потока к carrier thread. Используйте ReentrantLock вместо synchronized\n- Попытка пулить виртуальные потоки — они создаются по одному на задачу, пул не нужен\n- Предположение, что Virtual Threads ускоряют CPU-bound задачи — они помогают только для I\u002FO-bound\n\n### Как используется в 2026\n\nVirtual Threads стали стандартом для Spring Boot приложений. Реактивный стек (WebFlux, R2DBC) остаётся релевантным для изначально реактивных систем, но для типичного enterprise-приложения Virtual Threads устраняют основную мотивацию использования реактивного подхода.\n\n> **На собеседовании:** главное — объяснить разницу между platform threads и virtual threads: platform thread = обёртка над OS thread (ограничен тысячами), virtual thread = управляется JVM (миллионы). Упомяните pinning как главную проблему и ReentrantLock как решение. Бонус: \"Virtual Threads не заменяют реактивный стек полностью — для backpressure и streaming WebFlux остаётся актуальным\".","","middle",[15,16,17,18,19],"virtual-threads","project-loom","spring-boot","java-21","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":38,"featuredSnippetReady":39},"Что такое Virtual Threads и как они меняют разработку — Gymterview","Virtual Threads (Project Loom, Java 21): легковесные потоки JVM, включение в Spring Boot, Structured Concurrency. Pinning, ReentrantLock, сравнение с WebFlux.","Virtual Threads (Project Loom): как виртуальные потоки меняют Java — Gymterview","Virtual Threads в Java 21: включение в Spring Boot одной строкой, pinning проблема, Structured Concurrency и сравнение с реактивным стеком.",[28,29,30,31,32,33,34,35,36,37],"Virtual Threads","Project Loom","Java 21","виртуальные потоки","platform threads","pinning","Structured Concurrency","Spring Boot","WebFlux","собеседование","Virtual Threads (Java 21) — легковесные потоки JVM, позволяющие использовать синхронный код с масштабируемостью реактивного стека. Platform thread — обёртка над OS thread (тысячи), virtual thread — управляется JVM (миллионы). В Spring Boot включаются одной строкой spring.threads.virtual.enabled=true. Главная проблема: pinning при synchronized — используйте ReentrantLock. Не ускоряют CPU-bound задачи.",true]