Java 21 уже здесь: виртуальные потоки, шаблоны строк и многое другое
JEPs в Java 21 привнесут несколько важных готовых к релизу усовершенствований платформы

Java 21 официально доступна с 19 сентября 2023 года. Этот релиз представляет собой 12-й выпуск с функциональными улучшениями на платформе с новым стандартным полугодовым релизным графиком. (Ожидается, что Java 22 будет выпущена в марте 2024 года.).

В примечаниях к релизу Java 21 содержится огромное количество информации, и в этой статье мы рассмотрим некоторые основные моменты. Вы также можете ознакомиться со статьями Мохамеда Тамана "Java 21 sneak peek" и Николая Парлога "Going inside Java 21's rich, upcoming goodness".

Как сообщается в официальном блоге релиза, в Java 21 будут представлены десятки новых возможностей и улучшений. Пятнадцать из них появились в виде JEP, включая восемь готовых к использованию в производстве функций. Остальные являются функциями для превью и инкубаторными функциями, которые предназначены для исследования вами и вашей организацией, но еще не готовы к использованию в производстве, так как эти функции могут измениться в будущих версиях Java.

Большая часть новых функций в Java 21 относится к четырем основным инициативам платформы: Project Amber (повышение производительности разработчиков), Project Loom (переосмысление потоков), Project Panama (соединение Java и других платформ) и Project Valhalla (дополнение объектной модели Java объектами значений).

Другие JEP улучшают основные библиотеки Java и сборщики мусора, а некоторые готовят устаревшие функции Java к удалению в будущих релизах платформы.

JEP, готовые к релизу

Ниже перечислены готовые к релизу JEP, включенные в релиз Java 21.

JEP 431: Последовательные коллекции. Этот JEP вводит новые интерфейсы для представления коллекций с определенным порядком обхода. Каждая такая коллекция имеет четко определенный первый элемент, второй элемент и так далее, вплоть до последнего элемента. Также предоставляются унифицированные API для доступа к первому и последнему элементам коллекции, а также для обработки ее элементов в обратном порядке.

JEP 439: Поколенческий ZGC. Этот JEP повышает производительность приложений за счет расширения сборщика мусора Z (ZGC), позволяющего поддерживать отдельные поколения для молодых и старых объектов. Приложения, работающие с Поколенческим ZGC, должны получить более низкий риск задержек выделения памяти, меньшие требуемые затраты памяти кучи и меньшие затраты процессора на сборку мусора.

JEP 440: Шаблоны записи. Этот JEP расширяет возможности языка программирования Java, распространяя сопоставление шаблонов на экземпляры классов записей, что позволяет выполнять более сложные запросы к данным. Также добавлены вложенные шаблоны, которые позволят создавать более сложные запросы к данным.

JEP 441: Согласование шаблонов для оператора switch. Этот JEP увеличивает производительность языка программирования Java, делая его более семантичным, благодаря чему сложные запросы, ориентированные на данные, могут быть выражены кратко и безопасно. Это достигается за счет того, что шаблоны могут появляться в метках case, и в то же время требуется, чтобы оператор switch покрывал все возможные входные значения.

JEP 444: Виртуальные потоки. Виртуальные потоки могут значительно уменьшить усилия по написанию, поддержке и наблюдению за высокопроизводительными параллельными приложениями. Этот JEP позволяет серверным приложениям, написанным в простом стиле один поток на запрос (thread-per-request), масштабироваться с близким к оптимальному использованию аппаратных ресурсов, а также позволяет существующему коду, использующему java.lang.Thread API, переходить на виртуальные потоки с минимальными изменениями.

JEP 449: Утрачивает актуальность порт Windows 32-bit x86 для удаления. 32-битная версия Windows на процессорах x86 устарела. Она поддерживается в Java 21, но в будущем будет удалена. Этот JEP обновляет систему сборки таким образом, чтобы при попытке сконфигурировать сборку для Windows 32-bit x86 (x86-32) выводилось сообщение об ошибке. Это сообщение можно будет подавить с помощью новой опции конфигурации, но целью является именно стимулирование перехода на другую платформу.

JEP 451: Подготовка к запрету динамической загрузки агентов. Этот JEP готовит вас к будущему выпуску JDK, который по умолчанию будет запрещать загрузку агентов в работающую виртуальную машину JVM. Для этого будут выдаваться предупреждения при динамической загрузке агентов в работающую JVM. Обратите внимание, что инструменты обслуживания, загружающие агентов при запуске, не вызовут выдачу предупреждений ни в одном релизе. Этот JEP согласует возможность динамической загрузки агентов с другими так называемыми "супервозможностями", такими как глубокая рефлексия.

JEP 452: API механизма инкапсуляции ключей. Механизмы инкапсуляции ключей (KEM) представляют собой современные криптографические технологии, обеспечивающие защиту симметричных ключей с использованием асимметричной криптографии или криптографии с открытым ключом. Это API позволяет использовать несколько алгоритмов KEM, а также позволяет поставщикам услуг безопасности реализовывать алгоритмы KEM как в Java-коде, так и в нативном коде.

Превью и инкубатор JEP

Ниже представлен список превью и инкубаторов в Java 21. Для использования этих JEP необходимо использовать соответствующие флаги; подробности смотрите в документации к каждому JEP.

JEP 430: Шаблоны строк (превью). Данный JEP упрощает написание Java-программ, позволяя легко выражать строки, которые включают в себя вычисляемые во время выполнения программы значения, и повышая читаемость выражений, в которых смешиваются текст и выражения, независимо от того, помещается ли текст в одной исходной строке или охватывает несколько исходных строк. Кроме того, он повышает безопасность Java-программ, которые составляют строки из значений, предоставляемых пользователем, и передающих их другим системам.

JEP 442: API внешних функций и памяти (третье превью). Этот JEP предоставляет новый API, который помогает Java-программам взаимодействовать с кодом и данными за пределами среды выполнения Java. Благодаря эффективному вызову посторонних функций (кода вне JVM) и безопасному доступу к внешней памяти (памяти, не управляемой JVM), этот API позволяет Java-программам вызывать нативные библиотеки и обрабатывать нативные данные без хрупкости и опасности Java Native Interface (JNI).

JEP 443: Безымянные шаблоны и переменные (превью). Этот JEP расширяет возможности языка Java за счет безымянных шаблонов, которые соответствуют компоненту записи без указания имени или типа компонента, и безымянных переменных, которые могут быть инициализированы, но не использованы. И те, и другие обозначаются символом подчеркивания _.

JEP 445: Безымянные классы и методы main экземпляров (превью). Этот JEP предлагает плавный переход к Java для образовательных целей, позволяя преподавателям вводить концепции программирования постепенно. Он сокращает количество шаблонов и церемоний, что позволяет студентам писать свои первые программы без необходимости разбираться в особенностях языка, предназначенных для больших программ; в то же время он не вводит отдельного диалекта Java для начинающих или отдельного инструментария.

JEP 446: Областные значения (превью). JEP предоставляет модель программирования для обмена данными как внутри потока, так и с дочерними потоками, что упрощает анализ потока данных. Модель гарантирует, что данные, переданные вызывающей стороной, могут быть получены только легитимными вызывающими сторонами, а также рассматривает разделяемые данные как неизменяемые, что позволяет совместно использовать их многими потоками и обеспечивает оптимизацию во время выполнения.

JEP 448: Vector API (шестой инкубатор). Этот новый API позволяет выражать векторные вычисления, которые надежно компилируются во время выполнения в оптимальные векторные инструкции на поддерживаемых архитектурах процессоров, что обеспечивает производительность, превосходящую производительность эквивалентных скалярных вычислений.. Кроме того, в векторные маски добавлена операция исключающего или (XOR), а также улучшена производительность векторных перестановок, особенно когда они используются для перестановки элементов вектора или преобразования между векторами.

JEP 453: Структурированный параллелизм (превью). Этот JEP упрощает параллельное программирование путем введения API для структурированного параллелизма, и продвигает стиль параллельного программирования, который позволяет устранить общие риски, возникающие при отмене и завершении работы, такие как утечка потоков и задержки при отмене.

Загрузите Java 21 и начните работать уже сегодня

Эталонную реализацию Java 21 OpenJDK можно приобрести на сайте https://jdk.java.net/21/. Реализацию Oracle Java SE 21 можно найти на сайте https://www.oracle.com/java/technologies/downloads/

Java SE 21 от Oracle является релизом с долгосрочной поддержкой (LTS). Oracle будет предлагать долгосрочную поддержку Java 21 в течение как минимум восьми лет. Такое продление срока поддержки позволяет организациям гибко использовать приложения в производстве дольше при минимальном обслуживании и в конечном итоге перейти на новую версию на своих собственных условиях.

Обратите внимание, что основываясь на отзывах клиентов и использовании в экосистеме Java компания Oracle также объявила о продлении срока долгосрочной поддержки Java 11 как минимум до января 2032 года, что обеспечивает еще восемь лет поддержки и обновлений от Oracle.

Статью в оригинале можно прочитать тут