You are currently viewing A la découverte de Java 16

A la découverte de Java 16

  • Post category:java
  • Temps de lecture :6 min de lecture
Salut à toutes et à tous, Aujourd’hui, je vous propose un petit tour d’horizon de la version 16 de JAVA. Le JDK 16 est l’implémentation de référence open source de la version 16 de la plateforme Java SE. Elle est définie par la JSR 391. Le JDK 16 est disponible depuis le 16 mars 2021. Les binaires « prêts à la production sous GPL » sont disponibles auprès d’Oracle; les binaires d’autres fournisseurs vont bientôt être releasé.

Ceux qui nous arrivent ?

Maj du ZGC Garbage Collector

Apparu dans JAVA15, le Z Garbage Collector (ZGC) est un garbage collector évolutif à faible latence. L’objectif de cette évolution est reséquencé le traitement des threads simultanés. L’évolution supprime le traitement de pile de threads dans les points de restauration du ZGC, flexibilise le traitement de la pile et fournit un mécanisme par lequel les autres sous-systèmes HotSpot peuvent traiter les piles.

JEP 376: ZGC: Concurrent Thread-Stack Processing

Pattern Matching for instanceof

Pattern Matching for instanceof a été introduit  dans JAVA 14. Il a été mis à jour dans JAVA 15 et arrive en version finale dans JAVA 16, avec les améliorations suivantes:
  • Lever la restriction selon laquelle les variables de modèle sont implicitement finales, afin de réduire les asymétries entre les variables locales et les variables de modèle.
  • Lever une erreur de compilation pour une expression de paterne instanceof qui comparerait une expression de type S sur un paterne de type T, où S est un sous-type de T. Cette expression réussira toujours et est donc inutile.
JEP 397: Pattern Matching for instanceof

API Vector

L’API Vector est une nouvelle API qui sert à exprimer du calcul vectoriel (ex calcul matriciel). L’exécution se fera par les instructions machines. Elle sera donc optimisée en fonction de la plateforme.

Avant JAVA 16

void scalarComputation(float[] a, float[] b, float[] c) {
   for (int i = 0; i < a.length; i++) {
        c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
   }
}

Après JAVA 16

static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;

void vectorComputation(float[] a, float[] b, float[] c) {

    for (int i = 0; i < a.length; i += SPECIES.length()) {
        var m = SPECIES.indexInRange(i, a.length);
    // FloatVector va, vb, vc;
        var va = FloatVector.fromArray(SPECIES, a, i, m);
        var vb = FloatVector.fromArray(SPECIES, b, i, m);
        var vc = va.mul(va).
                    add(vb.mul(vb)).
                    neg();
        vc.intoArray(c, i, m);
    }
}

Ajout du support des sockets Unix

Le but de ce JEP est de prendre en charge toutes les fonctionnalités des sockets du domaine Unix qui sont communes aux principales plates-formes Unix et Windows. Les sockets Unix sont utilisés pour la communication inter-processus (IPC) sur le même hôte. Ils sont similaires aux sockets TCP / IP sauf qu’ils sont adressés par nom de fichier plutôt que par adresse IP et  numéro de port.

Un petit bout de code pour comprendre

ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(UnixDomainSocketAddress.of("path/to/socket/file");
while(true){
    SocketChannel socketChannel = serverChannel.accept();
    //do something with socketChannel...
}

Foreign Linker API

Cette API offre un accès purement Java de type statique au code natif. Cette API, associée à l’API Foreign-Memory (JEP 393), simplifiera considérablement le processus de liaison à une bibliothèque native ainsi qu’à la gestion des erreurs.

En remplaçant le JNI Java Native Interface (JNI) par un modèle purement JAVA, il sera plus facile d’accéder aux bibliothèques non-java. Cette version de l’API supportera le C sur x64 et AARch64. Elle est néanmoins désignée pour être étendu à d’autres langages et d’autres plateformes.

MethodHandle strlen = CLinker.getInstance().downcallHandle(
        LibraryLookup.ofDefault().lookup("strlen").get(),
        MethodType.methodType(long.class, MemoryAddress.class),
        FunctionDescriptor.of(C_LONG, C_POINTER)
);

long len = strlen.invokeExact(CLinker.toCString("Panama is back").address())

Foreign Memory Access API

L’API Foreign-Memory Access a été introduit dans Java 14 puis mis à jour dans Java 15. Ce JEP incorpore des améliorations basés sur sur les commentaires. Cette actualisation de l’API comprend:

  • Une séparation plus claire des rôles entre les interfaces MemorySegment et MemoryAddress;
  • Une nouvelle interface MemoryAccess qui fournit des accesseurs de mémoire statique communs afin de minimiser le recours à l’API VarHandle;
  • Une prise en charge des segments partagés ;
  • La possibilité d’enregistrer des segments avec un Cleaner.

JEP 393: Foreign-Memory Access

Ces deux API sont les bases du projet PANAMA qui résout les problèmes inhérents à JNI pour l’invocation de code natif. Si le sujet vous intéresse, je vous laisse lire mon article En route pour Panama, le pont entre Java et les APIs externes.

Ceux qui vont nous quitter ?

Activation RMI

L’activation RMI est une partie obsolète de RMI qui est facultative depuis Java 8. Reporté depuis JAVA 15.
Aucune autre partie de RMI ne sera obsolète.

JEP 385: Deprecate RMI Activation for Removal

Ceux qui nous quitte ?

Dans cette itération du langage, il n’y a pas de suppression.

Corrections & Mises à jour

Extraire directement la liste d'un Stream

L’API Stream se voit ajouter une méthode qui accumule les éléments dans une liste immuable.

Avant JAVA 16

stream.collect(Collectors.toList())

Avec JAVA 16

Stream.of("a", "b", "c").toList()

Laisser un commentaire

sept + deux =