Сегодня релиз Java 21🥳



Главные фичи новой версии:



🔸 Виртуальные потоки



В чём суть: для многих задач производительность ограничивается количеством потоков в ОС. Чтобы обойти это ограничение и использовать потоки на максимум, придумали множество способов — асинхронные библиотеки, реактивное программирование и тд. Вариант рабочий, но код усложняется.



Виртуальные потоки позволяют писать простой код и не упираться в ограничения ОС.



Ближайший аналог виртуальных потоков — горутины в Go. Собственно, горутины — основная причина, почему многие сервисы написаны на Go.



Более дальний аналог — корутины в Kotlin. Они имитируют виртуальные потоки на уровне библиотеки и несут большие накладные расходы. В java виртуальные потоки реализованы на уровне JVM, поэтому их производительность гораздо выше.



В теории виртуальные потоки принесут пользу большинству приложений. Посмотрим, что будет на практике.



🔸 Pattern matching



В этих постах (один, два) я подробно расписала, зачем нужен pattern matching в целом, и как он реализован в java. Вкратце: нужен не всем, реализация в джаве так себе



🔸 Sequenced collections



Новые методы в коллекциях: getFirst(), getLast(), reversed() и другие. Подробный пост тут



Интересные preview фичи:



🔹 String templates — интерполяция строк, возможность писать



String str = "Hello, ${name}!";



Подробнее в этом посте



🔹 Scoped Values — аналог ThreadLocal c ограниченной областью действия

🔹 Structured Concurrency — способ организации подзадач в многопоточной среде



Остальные фичи очень специфичные и вряд ли пригодятся большинству разработчиков:



▫️ Generational ZGC — в сборщик добавили поколения, как следует из названия. Молодые объекты будут собираться чаще, и сборщик будет работать эффективнее

▫️ Record Patterns — records можно использовать внутри case

▫️ Foreign Function & Memory API (Third Preview) — методы для работы с нативным кодом и управлению памятью за пределами JVM. Это нужно для приложений, которые хотят сами управлять размещением объектов в памяти и не зависеть от сборщика мусора.

▫️ Unnamed Patterns and Variables (Preview) — можно не указывать имя переменной, если оно не нужно. Вместо него ставить _



Например, в case:

case Point(int x, _) → …



Или при ловле исключения:

catch (IllegalStateException _)



Было бы удобно сделать такое для лямбд, но для этого есть отдельный JEP, который сделают чёрт знает когда



▫️ Deprecate the Windows 32-bit x86 Port for Removal — перестать работать с Windows 32-bit x86, в будущем удалить

▫️ Prepare to Disallow the Dynamic Loading of Agents



Агент — компонент, который изменяет классы при загрузке или меняет уже загруженные классы в JVM. Используется для мониторинга, профайлинга и других служебных целей



▫️ Key Encapsulation Mechanism API — методы для защиты ключей симметричного шифрования

▫️ Unnamed Classes and Instance Main Methods (Preview)



Видимо чтобы короче писать Hello World:

class HelloWorld {

void main() {

System.out.println("Hello, World!");

}

}



Вот такой релиз. Конечно, самая ожидаемая фича — это виртуальные потоки. Если планируете в ближайшее время внедрять их, отпишитесь по впечатлениям, мне очень интересно😊