OUR

Courses

Virtual Threads stellen in Java eine Innovation dar, die mit dem Project Loom ins Leben gerufen wurde. Sie dienen dazu, die gleichzeitige Bearbeitung vielfältiger Tasks effektiver zu gestalten. Diese Threads sind als eine Art leichtgewichtige Alternative zu den herkömmlichen Betriebssystem-Threads konzipiert und haben das Ziel, die Performanz von Applikationen, die eine hohe Anzahl paralleler Prozesse bewältigen, speziell bei I/O-wartenden Operationen, zu optimieren.

Die Vorteile von Virtual Threads sind vielfältig:

Erweiterte Skalierbarkeit: Im Gegensatz zu Plattform-Threads ermöglichen Virtual Threads das Management von Millionen gleichzeitiger Threads durch eine einzige Java-Instanz, was die Grenzen traditioneller Threads sprengt.

Gesteigerte Effizienz: Da Virtual Threads unter der Kontrolle der JVM stehen, können sie mit einer höheren Effizienz hinsichtlich der CPU-Nutzung geplant und verwaltet werden, was insbesondere dann zur Geltung kommt, wenn ein Thread auf eine I/O-Aktion wartet.

Vereinfachung von Parallelität: Mit Virtual Threads können Entwickler auf vertraute Synchronisationswerkzeuge zurückgreifen, um den Zugriff auf geteilte Ressourcen zu synchronisieren, anstatt sich auf komplexere asynchrone Strukturen verlassen zu müssen.

Weniger überflüssiger Code: Die Möglichkeit, synchrone Programmiermuster anzuwenden, verringert den Bedarf an zusätzlichem Code, der oft mit asynchroner Programmierung einhergeht.

Optimierte Performance bei I/O-intensiven Applikationen: Anwendungen, die stark von Ein- und Ausgabeoperationen abhängen, profitieren in besonderem Maße von den Eigenschaften der Virtual Threads, da diese die Blockadezeiten minimieren.

Vereinfachte Fehlerbehandlung: Die Handhabung von Fehlern in einem synchronen Programmierstil ist in der Regel intuitiver und leichter umzusetzen als in einem asynchronen Kontext.

Structured Concurrency ist ein Programmierparadigma in Java, das darauf abzielt, die Arbeit mit nebenläufigen Prozessen – also die Ausführung von mehreren Berechnungen parallel – zu vereinfachen und sicherer zu machen. Es handelt sich um ein Konzept, das die Lebensdauer von nebenläufigen Prozessen an die Programmstruktur, in der sie gestartet werden, bindet. Dies bedeutet, dass wenn eine Methode oder ein Block von Code nebenläufige Prozesse initiiert, diese Prozesse nicht über das Ende der Ausführung dieser Methode oder des Blocks hinaus weiterlaufen dürfen.

Structured Concurrency bringt mehrere Vorteile mit sich:

Einfachere Fehlerbehandlung: Fehler, die in nebenläufigen Prozessen auftreten, können an dem Punkt behandelt werden, an dem die Prozesse gestartet wurden, was die Fehlerbehandlung vereinfacht und zentralisiert.

Verbesserte Lesbarkeit: Da die nebenläufigen Prozesse eine klar definierte Struktur haben, wird der Code, der nebenläufige Operationen enthält, einfacher zu lesen und zu verstehen.

Lebenszyklusmanagement: Structured Concurrency hilft bei der Verwaltung des Lebenszyklus von Threads, indem es sicherstellt, dass alle gestarteten Threads beendet werden, bevor der übergeordnete Block abgeschlossen ist. Dies vermeidet „verwaiste“ Threads, die nach Beendigung des Hauptprogramms weiterlaufen und Ressourcen verbrauchen.

Sichere Beendigung: Wenn ein Block von Code, der nebenläufige Prozesse initiiert, abgeschlossen wird, werden alle seine Prozesse ordnungsgemäß beendet. Dies verhindert Probleme, die durch unerwartetes Abbrechen von Operationen entstehen könnten.

Verbesserte Ressourcennutzung: Durch die strukturierte Beendigung von nebenläufigen Prozessen kann eine effizientere Ressourcennutzung erzielt werden, da Ressourcen nicht unnötig von nicht mehr benötigten Prozessen belegt werden.

In Java kann Structured Concurrency durch verschiedene Mechanismen wie die ExecutorService-API oder Frameworks und Bibliotheken, die dieses Paradigma unterstützen, umgesetzt werden. Es ist auch ein wichtiger Teil des Designs hinter Project Loom, das die Einführung von leichtgewichtigen Threads – den Virtual Threads – plant, welche die Anwendung von Structured Concurrency in Java weiter erleichtern sollen.

Das Vector API in Java ist eine experimentelle API, die als Teil des Project Panama eingeführt wurde, um einen neuen Weg für die effiziente Ausführung von vektorbasierten Berechnungen zu ermöglichen. Diese API stellt einen großen Fortschritt in der Java-Plattform dar, da sie es ermöglicht, Vorteile der Vektorverarbeitungsfähigkeiten moderner CPUs direkt in Java zu nutzen.

Hier sind die wichtigsten Punkte des Vector API:

Performance-Steigerung: Durch die Nutzung von SIMD (Single Instruction, Multiple Data) Instruktionen können mit dem Vector API mehrere Datenoperationen gleichzeitig ausgeführt werden, was zu einer deutlichen Beschleunigung von Berechnungen führen kann.

Hardware-Ausnutzung: Das API ist darauf ausgelegt, die spezifischen Vektorhardware-Befehlssätze, die in modernen Prozessoren vorhanden sind, wie AVX in x86 oder NEON in ARM, effektiv zu nutzen.

Klarheit und Sicherheit: Obwohl es sich um eine Low-Level-Operation handelt, ist die API so gestaltet, dass sie in die Java-Sprache passt und die Sicherheits- und Klarheitsgarantien von Java beibehält.

Plattformunabhängigkeit: Programme, die das Vector API verwenden, sind plattformunabhängig, da die API die Unterschiede in den Befehlssätzen der Prozessoren abstrahiert. Die JVM ist verantwortlich für die Ausführung des am besten geeigneten Befehlssatzes für die aktuelle Plattform.

Entwicklerfreundlichkeit: Das API ist so konzipiert, dass es einfach zu verwenden ist und eine nahtlose Integration in den bestehenden Code ermöglicht, wodurch Entwickler ohne tiefgreifendes Verständnis der Vektorhardware leistungsstarke Optimierungen vornehmen können.

Das Vector API befindet sich in einem inkrementellen Entwicklungsprozess und ist Teil der JDK-Enhancement-Proposals (JEPs), die die Entwicklung und Integration neuer Features in das JDK steuern. Mit jeder neuen Java-Version werden Verbesserungen und Erweiterungen am Vector API vorgenommen, um die Performance und Benutzerfreundlichkeit zu steigern.—-

 

Finale Neuerungen Java 18 – 21

  • Pattern Matching for switch
  • Record Patterns
  • Scoped Values
  • Foreign Function & Memory API
  • Virtual Threads
  • Sequenced Collections
  • Internet-Address Resolution SPI

 

Finale Neuerungen Java 22-25

  • Launch Multi-File Source-Code Programs
  • Unnamed Variables & Patterns
  • Markdown Documentation Comments
  • Stream Gatherers
  • Key Derivation Function API
  • Module Import Declarations
  • Flexible Constructor Bodies
  • Compact Source Files and Instance Main
  • Class-File API
  • Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
  • Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm

 

JVM Änderungen

  • Ahead-of-Time Class Loading & Linking, Profiling, Command-Line Ergonomics
  • JFR Cooperative Sampling
  • Compact Object Headers
  • JFR Method Timing & Tracing
  • Remove the Windows 32-bit x86 Port
  • Garbage Collector Changes (Shanandoa, ZGC)
  • 32-bit x86 Port for Removal

 

Previews & Incubators

  • Stable Values
  • PEM Encodings of Cryptographic Objects
  • Structured Concurrency
  • Primitive Types in Patterns, instanceof, and switch
  • Vector API
  • JFR CPU-Time Profiling
  • String Templates

Previous knowledge

  • Basics in Java Programming
    Java Programming Language

Target group

  • Java-Entwickler, die von Java 8-17
    auf Java 21 oder Java 25 umsteigen wollen