Java SE 20 Veröffentlichung

Nach sechs Monaten Entwicklung hat Oracle die Plattform Java SE 20 (Java Platform, Standard Edition 20) veröffentlicht, deren Referenzimplementierung auf dem offenen Projekt OpenJDK basiert. Mit Ausnahme der Entfernung einiger veralteter Funktionen bleibt die RĂŒckwĂ€rtskompatibilitĂ€t zu frĂŒheren Versionen der Java-Plattform in Java SE 20 erhalten — die meisten zuvor geschriebenen Java-Projekte werden ohne Änderungen mit der neuen Version lauffĂ€hig sein. Installationsfertige Builds von Java SE 20 (JDK, JRE und Server JRE) wurden fĂŒr Linux (x86_64, AArch64), Windows (x86_64) und macOS (x86_64, AArch64) vorbereitet. Die Referenzimplementierung von Java 20, die im Rahmen des OpenJDK-Projekts entwickelt wurde, ist vollstĂ€ndig unter der GPLv2-Lizenz mit GNU ClassPath-Ausnahmen veröffentlicht, die die dynamische Bindung an kommerzielle Produkte zulassen.

Java SE 20 gehört zu den Versionen mit normaler UnterstĂŒtzung, fĂŒr die Updates bis zur nĂ€chsten Veröffentlichung bereitgestellt werden. FĂŒr die langfristig unterstĂŒtzte Version (LTS) sollte Java SE 17 verwendet werden, fĂŒr die Updates bis 2029 bereitgestellt werden. Es ist zu beachten, dass mit der Veröffentlichung von Java 10 das Projekt zu einem neuen Entwicklungsprozess ĂŒbergegangen ist, der einen kĂŒrzeren Zyklus fĂŒr die Erstellung neuer Versionen vorsieht. Neue Funktionen werden jetzt in einem stĂ€ndig aktualisierten Master-Zweig entwickelt, der bereits fertige Änderungen enthĂ€lt und von dem alle sechs Monate Abzweigungen fĂŒr die Stabilisierung neuer Versionen vorgenommen werden.

Aus den Neuerungen von Java 20 sind folgende Punkte hervorzuheben:

  • Vorgeschlagen wurde eine vorlĂ€ufige UnterstĂŒtzung fĂŒr eingeschrĂ€nkte Werte (Scoped Values), die es ermöglicht, unverĂ€nderliche Daten in Threads gemeinsam zu nutzen und effizient zwischen Unter-Threads auszutauschen (die Werte werden vererbt). Scoped Values entwickeln sich zur Ablösung des Mechanismus der thread-lokalen Variablen (thread-local variables) und sind bei der Nutzung einer sehr großen Anzahl von virtuellen Threads (Tausende und Millionen von Threads) effizienter. Der Hauptunterschied zwischen Scoped Values und thread-lokalen Variablen besteht darin, dass erstere einmal geschrieben werden, danach nicht mehr geĂ€ndert werden können und nur wĂ€hrend der Laufzeit des Threads verfĂŒgbar bleiben. class Server { final static ScopedValue CURRENT_USER = new ScopedValue(); void serve(Request request, Response response) { var level = (request.isAuthorized() ? ADMIN : GUEST); var user = new User(level); ScopedValue.where(CURRENT_USER, user) .run(() -> Application.handle(request, response)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); return new DBConnection(
); } }
  • Eine zweite vorlĂ€ufige Implementierung von Record Patterns wurde hinzugefĂŒgt, die die in Java 16 eingefĂŒhrte Möglichkeit der Mustererkennung bei der Analyse von Werten des Typs Record erweitert. Zum Beispiel: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x + y); } }
  • Eine vierte vorlĂ€ufige Implementierung der Mustererkennung in switch-AusdrĂŒcken wurde hinzugefĂŒgt, die es ermöglicht, in den case-Klauseln flexible Muster zu verwenden, die eine Reihe von Werten abdecken, fĂŒr die zuvor umstĂ€ndliche if
else-AusdrĂŒcke verwendet werden mussten. static String formatterPatternSwitch(Object obj) { return switch (obj) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); }; }
  • Eine zweite vorlĂ€ufige Implementierung der FFM-API (Foreign Function & Memory) wurde hinzugefĂŒgt, die es ermöglicht, die Interaktion von Java-Programmen mit externem Code und Daten ĂŒber Funktionsaufrufe aus externen Bibliotheken und den Zugriff auf Speicher außerhalb der JVM zu organisieren.
  • Die zweite vorlĂ€ufige Implementierung virtueller Streams wurde hinzugefĂŒgt, die aus leichten Streams bestehen und das Schreiben und Pflegen von hochperformanten Mehrthread-Anwendungen erheblich erleichtern.
  • Eine zweite Version der experimentellen API fĂŒr strukturierten Parallelismus wurde hinzugefĂŒgt, die die Entwicklung von Mehrthread-Anwendungen durch die Verarbeitung mehrerer Aufgaben, die in verschiedenen Threads ausgefĂŒhrt werden, als einen einzigen Block vereinfacht.
  • Die fĂŒnfte vorlĂ€ufige Implementierung der API Vector wurde hinzugefĂŒgt, die Funktionen fĂŒr Vektorrechnungen bereitstellt, die mithilfe von Vektorinstruktionen der Prozessoren x86_64 und AArch64 durchgefĂŒhrt werden und es ermöglichen, Operationen gleichzeitig auf mehrere Werte anzuwenden (SIMD). Im Gegensatz zu den im JIT-Compiler HotSpot verfĂŒgbaren Möglichkeiten zur Autovektorisierung von skalaren Operationen ermöglicht die neue API eine explizite Steuerung der Vektorisierung fĂŒr die parallele Datenverarbeitung.

Quelle: opennet.ru

60GB SSD 8Gb DDR4