
Сравнение моделей конкурентности JVM языков: Треды, Пулы и Structured Concurrency
rurikovich 28 минут назад Сравнение моделей конкурентности JVM языков: Треды, Пулы и Structured Concurrency Средний 6 мин 1.5K Высоконагруженные системы * Java * Scala * Kotlin * Анализ и проектирование систем * Обзор...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. rurikovich 28 минут назад Сравнение моделей конкурентности JVM языков: Треды, Пулы и Structured Concurrency Средний 6 мин 1. 5K Высоконагруженные системы * Java * Scala * Kotlin * Анализ и проектирование систем * Обзор Привет, ХабрМногие если не все встречались с потоками, пулами потоков и проблемами многопоточности и конкурентности. В JVM языках под капотом одна и таже платформа, но Java, Kotlin, Scala и Clojure по-разному работают с потоками, задачами и ожиданием I/O.
В Java кроме классических потоков появились virtual threads. В Kotlin давно есть корутины. В Scala есть ZIO со своим runtime и fiber’ами.
Технические детали
В Clojure есть futures, promises, agents и core. Снаружи это всё может выглядеть как разные способы выполнить работу параллельно, но внутри модели сильно отличаются. Мы сравним эти подходы на простых для backend-разработки вещах: как запускается задача, где используются реальные потоки, а где логические, что происходит при ожидании I/O и кто отвечает за отмену.
Заодно будет видно, почему в Java можно спокойно писать блокирующий код, а в Kotlin, Scala и Clojure чаще появляются async, await, flatMap. В первой части начну с Java-базы: обычный Thread, thread pools, virtual threads из Project Loom и Structured Concurrency. В следующих будут корутины, zio-runtime с fibers и Clojure.
Классический Java ThreadНачнём с базы. В Java Thread исторически был довольно прямым отражением потока операционной системы. Не всегда один-в-один в деталях реализации JVM и ОС, но для прикладного программиста модель была примерно такая:java.
Отраслевые последствия
Thread -> native/platform thread -> OS scheduler У такого потока есть стек, системные структуры, участие планировщика ОС, переключение контекста. Это не бесплатная штука. Создавать поток под каждую мелкую задачу можно, но недолго.
Java: создание обычного потокаThread thread = new Thread(() -> { System. println("Working in " + Thread. currentThread()); }); thread.
join(); В маленькой программе всё выглядит нормально. В сервере под нагрузкой начинается веселье: тысячи соединений, ожидание БД, внешние HTTP-вызовы, очереди, таймауты. Если на каждый запрос заводить платформенный поток, можно быстро упереться не в CPU, а в память и планировщик.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





