Java 19 ist da / Sudo Null IT News

Öffentliche Version veröffentlicht Java 19. Mehr als zweitausend geschlossene Aufgaben und 7 JEPs. Versionshinweise können eingesehen werden hier. API-Änderungen – hier.

Download links:

Hier ist eine Liste von JEPs, die es in Java 19 geschafft haben

Musterabgleich für Schalter (Dritte Vorschau) (JEP 427)

Musterabgleich für Schalter, die erschien in Java 17 im Vorschaumodus und blieb an zweite Vorschau in Java 18, bleibt immer noch in diesem Status. Dies ist das erste Mal in Java, dass zwei Releases nicht ausreichten, damit ein Sprachkonstrukt stabil wurde: Früher passten alle Konstrukte in zwei Vorschauversionen.

In dieser Version gibt es zwei wesentliche Änderungen beim Musterabgleich.

Erstens wurden die Schutzmuster && durch when-Klauseln ersetzt:

// –enable-preview –release 18: switch (obj) { case Integer x && x > 0 -> …; Standard -> …; }// –enable-preview –release 19: switch (obj) { case Integer x when x > 0 -> …; Standard -> …; }

Die Motivation für diese Änderung können Sie nachlesen. in der Mailingliste des Amber-Projekts.

Zweitens wurde das Verhalten des Nullabgleichs geändert. Jetzt null passt nur im Fall null branch und große in keinem anderen, einschließlich aller:

// –enable-preview –release 18: Object obj = null; switch (obj) { case Objekt x -> …; // stimmt überein, weil Gesamtmuster }// –enable-preview –release 19: Object obj = null; switch (obj) { case Objekt x -> …; // NPE }// –enable-preview –release 19: Object obj = null; switch (obj) { case null -> …; // OK-Fall Objekt x -> …; }

Lesen Sie auch die Gründe für diese Änderung. in der Mailingliste.

Aufzeichnungsmuster (Vorschau) (JEP 405)

Der Musterabgleich wurde um einen neuen Mustertyp ergänzt: das Pfostenmuster.

Bisher war nur Muster nach Typ für den Musterabgleich von Datensätzen verfügbar, mit weiterer manueller Extraktion von Komponenten:

record Point(int x, int y) {} static void printSum(Object o) { if (o instanceof Point p) { int x = px(); int y = py(); System.out.println(x + y); } }

Mit Post Patterns wird der Code viel kompakter:

static void printSum(Object o) { if (o instanceof Point(int x, int y)) { System.out.println(x + y); } }

Beitragsmuster können verschachtelt werden:

record Point(int x, int y) {} enum Color { RED, GREEN, BLUE } record ColoredPoint(Point p, Color c) {} static void printCoordinatesAndColor(ColoredPoint cp) { if (cp instanceof ColoredPoint(Point(var x, var y), var c)) { System.out.println(“x = ” + x); System.out.println(“y = ” + y); System.out.println (“color = ” + c); } }

Aufzeichnungsmuster können auch benannt werden:

static void printObject(Object obj) { if (obj instanceof Point(var x, var y) p) { System.out.println(“point = ” + p); System.out.println(“x = ” + x); System.out.println(“y = ” + y); } }

Außerdem passen die Post-Muster gut zum Schalter aus dem vorherigen JEP:

static void printObject(Object obj) { switch (obj) { case Point(var x, var y) when x > 0 && y > 0 -> System.out.println(“Positiver Punkt: x = ” + x + “, y=” + y); case Point(var x, var y) -> System.out.println(“Point: x = ” + x + “, y = ” + y); default -> System.out.println(“Andere”); } }

Virtuelle Threads (Vorschau) (JEP 425)

Java hat virtuelle Threads im Vorschaumodus eingeführt.

Virtuelle Threads sind im Gegensatz zu Betriebssystem-Threads leichtgewichtig und können in großer Zahl (Millionen von Instanzen) erstellt werden. Dieses Feature sollte es viel einfacher machen, nebenläufige Programme zu schreiben, da es Ihnen ermöglicht, einen einfachen One-Request-One-Thread-Ansatz zu verwenden, ohne auf komplexere asynchrone Programmierung zurückgreifen zu müssen. Gleichzeitig sollte die Migration von bereits existierendem Code zu virtuellen Threads so einfach wie möglich sein, da virtuelle Threads Instanzen einer existierenden Klasse sind java.lang.Threadwas bedeutet, dass der größte Teil des vorhandenen Codes nicht neu geschrieben werden muss.

Virtuelle Threads werden zusätzlich zu regulären Threads implementiert und existieren nur für die JVM, nicht für das Betriebssystem (daher der Name „virtuell“). Der Thread, auf dem der virtuelle Thread gerade läuft, wird als Host-Thread bezeichnet. Wenn sich Plattform-Threads auf den Betriebssystem-Scheduler verlassen, dann ist es der Scheduler für virtuelle Threads ForkJoinPool. Wenn ein virtueller Thread bei einer Blockierungsoperation blockiert, wird er von seinem Host-Thread ausgehängt, sodass der Host-Thread einen anderen virtuellen Thread einhängen und seine Ausführung fortsetzen kann. Durch diese Arbeitsweise und die geringe Größe virtueller Threads lassen sie sich sehr gut skalieren. Derzeit gibt es jedoch zwei Ausnahmen: synchronisierte Blöcke und JNI. Bei der Ausführung kann der virtuelle Thread nicht ausgehängt werden, da er an seinen Host-Thread gebunden ist. Eine solche Beschränkung kann eine Skalierung verhindern. Wenn Sie das Potenzial virtueller Threads maximieren möchten, wird daher empfohlen, synchronisierte Blöcke und JNI-Vorgänge zu vermeiden, die häufig ausgeführt werden oder lange dauern.

Um virtuelle Threads zu erstellen und mit ihnen zu arbeiten, erschien die folgende API:

Unterstützung wurde auch für virtuelle Threads im Debugger, JVM TI und Java Flight Recorder hinzugefügt.

Virtuelle Threads werden entwickelt seit 2017 In den Grenzen des Projekts Webstuhl.

Strukturierte Parallelität (Inkubator) (JEP 428)

Ein weiteres Ergebnis der Arbeit am Loom-Projekt war die Hinzufügung einer neuen API für strukturierte Parallelität zu Java.

Structured Concurrency ist ein Multithread-Programmieransatz, der Prinzipien der strukturierten Singlethread-Programmierung übernimmt. Die Grundidee dieses Ansatzes ist wie folgt: Wenn eine Aufgabe in mehrere konkurrierende Unteraufgaben aufgeteilt wird, dann werden diese Unteraufgaben im Codeblock der Hauptaufgabe wieder vereint. Alle Teilaufgaben sind logisch gruppiert und hierarchisch organisiert. Jede Unteraufgabe ist in ihrer Lebensdauer auf den Umfang des Codeblocks der Hauptaufgabe beschränkt.

Im Zentrum der neuen API-Klasse StructuredTaskScope. Ein Beispiel für die Verwendung des StructuredTaskScope, das eine Aufgabe zeigt, die zwei Teilaufgaben parallel ausführt und auf das Ergebnis ihrer Ausführung wartet:

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future user = scope.fork(() -> findUser()); Future order = scope.fork(() -> fetchOrder()); Geltungsbereich.join(); // Beide Forks verbinden scope.throwIfFailed(); // … und Fehler weitergeben return new Response(user.resultNow(), order.resultNow()); }

Es mag den Anschein haben, dass mit ExecutorService und submit() genau derselbe Code geschrieben werden könnte, aber StructuredTaskScope weist mehrere grundlegende Unterschiede auf, die den Code sicherer machen:

  • Die Lebensdauer aller Subtask-Threads wird durch den Geltungsbereich des try-with-resources-Blocks begrenzt. Die Methode close() wird garantiert erst abgeschlossen, wenn alle Teilaufgaben abgeschlossen sind.
  • Wenn eine der findUser()- und fetchOrder()-Operationen fehlschlägt, wird die andere Operation automatisch abgebrochen, wenn sie noch nicht abgeschlossen ist (im Fall der ShutdownOnFailure-Richtlinie sind andere möglich).
  • Wenn der Haupt-Thread unterbrochen wird, während er auf join() wartet, werden sowohl findUser()- als auch fetchOrder()-Operationen abgebrochen.
  • Der Thread-Dump zeigt die Hierarchie: Die Threads, die findUser() und fetchOrder() ausführen, werden als Kinder des Haupt-Threads angezeigt.

Die neue API soll das Schreiben von Multithreading-Programmen durch einen vertrauten strukturellen Ansatz erleichtern. Solange die API inkubiert wird, befindet sie sich im Modul jdk.incubator.concurrent und das gleiche Paket.

Fremdfunktions- und Speicher-API (Vorschau) (JEP 424)

Foreign Function & Memory API, die sich in der Inkubation befand bei Java17 und Java 18, ist jetzt zur Vorschau-API geworden. Es ist im Paket. java.lang.fremd.

Vektor-API (Vierter Inkubator) (JEP 426)

Vector API, das sich bereits seit drei Releases im Inkubationsstatus befindet (Java16, Java 17, Java 18) ist noch drin. Bis die API den Inkubationszustand verlässt, befindet sie sich im Modul jdk.incubator.vector.

Linux/RISC-V-Port (JEP 422)

Das JDK ist jetzt offiziell auf die Linux/RISC-V-Architektur portiert.

Fazit

Java 19 ist kein LTS-Release und wird nur für ein halbes Jahr (bis März 2023) von Oracle mit Updates versorgt. Azul verspricht jedoch, zumindest Zulu-Updates zu veröffentlichen bis März 2025 (2,5 Jahre).

Similar Posts

Leave a Reply

Your email address will not be published.