Na zes maanden ontwikkeling heeft Oracle het platform Java SE 20 (Java Platform, Standard Edition 20) uitgebracht, waarvan het open project OpenJDK als referentie-implementatie fungeert. Behalve de verwijdering van enkele verouderde functies, is de achterwaartse compatibiliteit met eerdere versies van het Java-platform behouden in Java SE 20 — de meeste eerder geschreven Java-projecten zullen zonder wijzigingen functioneren onder de nieuwe versie. Installatieklare builds van Java SE 20 (JDK, JRE en Server JRE) zijn voorbereid voor Linux (x86_64, AArch64), Windows (x86_64) en macOS (x86_64, AArch64). De referentie-implementatie van Java 20, ontwikkeld onder het OpenJDK-project, is volledig open onder de GPLv2-licentie met uitzonderingen van GNU ClassPath, die dynamische koppeling met commerciële producten toestaan.
Java SE 20 valt onder de categorie releases met een gewone ondersteuningsperiode, waarvoor updates zullen worden uitgebracht tot de volgende release. Voor een lange termijn ondersteuningsbranch (LTS) dient Java SE 17 te worden gebruikt, waarvan updates zullen worden uitgebracht tot 2029. Ter herinnering, vanaf de release van Java 10 is het project overgestapt naar een nieuw ontwikkelingsproces, wat een kortere cyclus voor het creëren van nieuwe releases inhoudt. Nieuwe functionaliteit wordt nu ontwikkeld in één voortdurend bijgewerkte masterbranch, die al gereed zijnde wijzigingen opneemt en waarvan om de zes maanden branches worden afgetakt voor de stabilisatie van nieuwe releases.
De nieuwigheden van Java 20 zijn onder andere:
- Voorlopige ondersteuning voor beperkte waarden (Scoped Values) is aangeboden, waarmee onveranderlijke gegevens in threads kunnen worden gedeeld en effectief gegevens kunnen worden uitgewisseld tussen sub-threads (waarden worden geërfd). Scoped Values worden ontwikkeld ter vervanging van het mechanisme van thread-lokale variabelen (thread-local variables) en zijn efficiënter bij het gebruik van een zeer groot aantal virtuele threads (duizenden en miljoenen threads). Het belangrijkste verschil tussen Scoped Values en thread-lokale variabelen is dat de eerste één keer worden geschreven, daarna niet meer kunnen worden gewijzigd en alleen beschikbaar blijven gedurende de uitvoering van de thread. 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(…); } }
- Een tweede voorlopige implementatie van recordpatronen (record pattern) is toegevoegd, die de in Java 16 geïntroduceerde mogelijkheid van patroonmatching voor het parseren van waarden van record-klasse uitbreidt. Bijvoorbeeld: 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); } }
- Een vierde voorlopige implementatie van patroonmatching in switch-uitdrukkingen is toegevoegd, waarmee in 'case'-labels geen exacte waarden, maar flexibele patronen kunnen worden gebruikt die een reeks waarden omvatten, waarvoor eerder omvangrijke if…else-ketens moesten worden gebruikt. 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 -> obj.toString(); }; }
- Een tweede voorlopige implementatie van de FFM API (Foreign Function & Memory) is toegevoegd, waarmee Java-programma's kunnen interageren met externe code en gegevens via het aanroepen van functies uit externe bibliotheken en toegang tot geheugen buiten de JVM.
- De tweede voorlopige implementatie van virtuele stromen is toegevoegd, waarbij het gaat om lichtgewicht stromen die het schrijven en onderhouden van hoogpresterende multithread-toepassingen aanzienlijk vereenvoudigen.
- De tweede versie van de experimentele API voor gestructureerd parallelisme is toegevoegd, die de ontwikkeling van multithread-toepassingen vergemakkelijkt door meerdere taken die in verschillende stromen worden uitgevoerd als één geheel te behandelen.
- De vijfde voorlopige implementatie van de Vector API is toegevoegd, die functies biedt voor vectorberekeningen die worden uitgevoerd met behulp van vectorinstructies van de x86_64- en AArch64-processors, en waarmee gelijktijdig operaties op meerdere waarden kunnen worden toegepast (SIMD). In tegenstelling tot de mogelijkheden voor automatische vectorisatie van scalair bewerkingen die door de JIT-compiler HotSpot worden geboden, maakt de nieuwe API het mogelijk om expliciet beheer van vectorisatie voor parallelle gegevensverwerking mogelijk te maken.
Bron: opennet.ru
