← Заметки

Java 21: виртуальные потоки, упорядоченные коллекции и границы preview

Виртуальные потоки, упорядоченные коллекции, образцы record и сопоставление с образцом в switch — окончательные возможности JDK 21, доступные без флагов preview. Шаблоны строк в этом выпуске ещё были предварительными; обновление JDK не придаёт всем новым возможностям одинаковый статус стабильности. Примечания к выпуску JDK 21 различают окончательные возможности, preview и инкубацию.

Java 21 стал общедоступен 19 сентября 2023 года. Статья возвращается к этому выпуску через воспроизводимый пример. Она не рекомендует новейший JDK или версию исправлений для рабочей среды.

Порядок обработки

Схема следует Jdk21Example без флагов preview. Обратный список — представление; join ждёт вывода виртуального потока.

Схема следует Jdk21Example без флагов preview. Обратный список — представление; join ждёт вывода виртуального потока.

Статус возможностей в JDK 21

Возможность Статус в JDK 21 Что проверить
Виртуальные потоки Окончательный Рассматривать для множества задач с ожиданием ввода-вывода; ускорение вычислений CPU не гарантируется
Упорядоченные коллекции Окончательный Согласованные API для первых/последних элементов и обратных представлений
Образцы record и сопоставление с образцом в switch Окончательный Декомпозиция значений и ветвление по образцам
Шаблоны строк Preview Не предполагать сохранение в последующих JDK
Структурированная конкурентность Preview Оценивать отдельно от окончательного статуса виртуальных потоков
Vector API Шестая инкубация Отличать инкубационные API от окончательных возможностей и preview

Это выборочный список. Примечания к выпуску JDK 21 также описывают статусы preview и инкубации. Статус языковых возможностей проверяйте в изменениях языка Java 21. Шаблоны строк не вошли в JDK 23; см. их историю и стандартные альтернативы.

Компиляция без флагов preview

Следующий код выполнялся локально на Zulu JDK 21.0.1. Эта старая версия исправлений фиксирует среду воспроизведения, а не рекомендацию для эксплуатации. Сначала проверьте, что javac и java относятся к одной установке JDK 21.

Jdk21Example.java

import java.util.ArrayList;
import java.util.List;

public class Jdk21Example {
    record Point(int x, int y) {}

    static String describe(Object value) {
        return switch (value) {
            case null -> "missing";
            case Point(int x, int y) -> "point=" + x + "," + y;
            default -> "other";
        };
    }

    public static void main(String[] args) throws InterruptedException {
        var names = new ArrayList<>(List.of("alpha", "beta", "gamma"));
        var reverse = names.reversed();
        names.set(0, "ALPHA");
        System.out.println(names.getFirst() + "/" + names.getLast());
        System.out.println(reverse);
        System.out.println(describe(new Point(2, 3)));
        System.out.println(describe(null));
        Thread worker = Thread.ofVirtual().start(() ->
                System.out.println("virtual=" + Thread.currentThread().isVirtual()));
        worker.join();
    }
}
javac --release 21 Jdk21Example.java
java Jdk21Example
ALPHA/gamma
[gamma, beta, ALPHA]
point=2,3
missing
virtual=true

reversed() возвращает обратное представление, а не независимую копию. После изменения первого элемента исходного списка последним в обратном выводе тоже становится ALPHA. Вызов getFirst() для пустой коллекции вызвал бы исключение; здесь список непустой. Контракт представления определяет API SequencedCollection.

Point(int x, int y) — образец record, а case null отдельно обрабатывает null. Виртуальный поток выводит последнюю строку, и join() ждёт его завершения. Это проверка поведения API без измерения пропускной способности или задержки. Руководство по виртуальным потокам объясняет их пригодность для конкурентных задач, где преобладает ожидание ввода-вывода.

Перед сменой среды выполнения приложения проверьте совместимость фреймворка, инструментов сборки и агентов инструментирования с JDK 21. Статус возможностей JDK и срок поддержки дистрибьютора — разные вопросы. История Temurin 21 и выбор бинарных файлов показывают, как проверить фактически опубликованные дистрибьютором файлы.

Обсуждение

Посмотреть на GitHub ↗