Note : 5 ; Essentiellement intéressant pour la programmation par acteurs, bien que le traitement du sujet soit largement perfectible.
Ce livre a attiré mon attention, car il traite de programmation concurrente, non spécifiquement en Java, mais sur différents langages de la JVM. Dans la pratique, on parle presqu’exclusivement de Java et de Scala. Clojure parvient à se ménager une petite place, surtout que STM vient de là, mais JRuby et Groovy sont abordés de manière vraiment très succincte en fin de livre.
Du livre, parlons-en : il s’agit d’un texte de 250 pages découpé en 5 parties (la 5ème ne contient qu’un court chapitre de conclusion) et totalisant 10 chapitres. Le premier chapitre est une courte introduction illustrée par du multithread « de base » en Java. Il nous présente le thème récurrent du texte : « shared mutability is pure evil ! ».
La première partie s’intitule « stratégies for concurrency » et se contente de 2 chapitres sur 30 pages. Le chapitre 2 « division of labour » évoque le mapping des tâches avec des threads dans différentes configurations applicatives. C’est un sujet instinctivement naturel mais bien illustré ici. Le texte ayant pris quelques rides, il ne pouvait évoquer les co-routines popularisées par Go et désormais disponibles sur la JVM. Au chapitre 3, on prépare la seconde partie en évoquant, hélas de manière légère, des options de conception liées à la gestion des états, et plus précisément l’impact de la mutabilité. Un chapitre un peu décevant.
La seconde partie est forte d’une quarantaine de pages et couvre le « Java Moderne » sur deux chapitres. Sécurisation des threads et scalabilité sont au menu du chapitre 4. Ici l’auteur explore différentes solutions de sécurisation, comme les exclusions mutuelles, les collections sécurisées, les Futures ou les AtomicLong… Un chapitre assez conséquent et relativement intéressant. Enfin le chapitre 5 sert à en remettre une couche sur la mutabilité partagée. Cela ressemble surtout à une introduction pour la partie suivante !
La partie suivante, justement, s’intitule « Software Transactional Memory », toujours couvert sur 2 chapitres mais cette fois avec 75 pages. Le chapitre destiné à expliquer STM constitue le cœur de cette partie. Il est imposant et finalement compliqué à appréhender. D’autant que l’auteur introduit le concept à l’aide de Clojure avec lequel je suis peu familier (c’est le moins que l’on puisse dire). Le reste du chapitre souffre de la faiblesse de l’explication initiale. Le chapitre 7 n’est qu’une déclinaison des exemples développés précédemment en Groovy, Java, Scala et JRuby. Cela fait un peu « travail à la chaine » …
La quatrième partie fait jeu égale avec la troisième en termes de taille. Elle est consacrée à l’approche acteurs et est aussi constituée de 2 chapitres. C’est aussi un imposant chapitre qui introduit l’approche acteurs. Toutefois, j’ai trouvé les explications de meilleure qualité (et le langage Scala m’est aussi plus familier), sans compter les quelques diagrammes que j’aurais bien aimé retrouver avant. C’est sans doute le chapitre que j’ai préféré de tout le livre. Comme pour la troisième partie, le chapitre 9 décline l’approche pour les autres langages de la JVM et j’ai tout autant de mal à m’enthousiasmer pour ces déclinaisons peu inventives.
La cinquième partie ne contient qu’un seul chapitre. Les quelques pages qu’il couvre prennent un peu de hauteur par rapport au propos pour nous guider dans notre choix de stratégie concurrente. C’est une bonne façon de conclure.
Le risque d’obsolescence d’un tel texte était important et c’est bien ce que nous découvrons ici. L’auteur s’appuie trop sur des librairies spécifiques qui ont fait leur temps et pas suffisamment sur des principes plus résilients même s’ils sont sous-jacents au texte. Malgré ce que dit le titre, on ne parle guère de la JVM bien que le comportement de celle-ci puisse beaucoup avoir à faire avec la gestion des threads.
Référence complète : Programming Concurrency on the JVM – Venkat Subramaniam – The Pragmatic Bookshelf 2011 – ISBN: 978 1 93435 676 0