Bonjour collègues!
L'article, dont nous proposons aujourd'hui la traduction, rappelle une fois de plus l'importance du livre sans âge "
Java Concurrency in practice " de Brian Goetz.
Les dates des commentaires sur cet article dans l'original suggèrent que l'auteur ne le met pas à jour et ne le republie pas pour la première fois. Par conséquent, nous nous sommes également permis de mettre à jour le lien vers le livre mentionné dans l'article de Raul-Gabriel Urm, Mario Fusco et Alan Mycroft, publié par Manning sous le titre Java 8 in Action. Nous préparons la traduction d'une nouvelle édition appelée Modern Java. Mais pour l'instant, parlons des classiques. Vous êtes invité à chat.
Un lecteur avec le surnom Shobhit m'a posé cette question dans les commentaires sur un article sur
12 livres Java avancés pour les programmeurs de niveau intermédiaire - partie 1 . La question est vraiment bonne, et je pense que de nombreux programmeurs Java avaient des doutes similaires lorsque, à notre époque, quelqu'un leur recommandait de lire
Java Concurrency en pratique . Lorsque ce livre a été publié pour la première fois, en 2006, le monde Java entier ne pouvait toujours pas comprendre les innovations dans le domaine de la concurrence faites dans Java 1.5. Je pense que la première tentative sérieuse a été faite pour améliorer le support intégré de Java pour le multithreading et la compétitivité. Ensuite, de nombreux programmeurs ne soupçonnaient même pas les nouveaux outils apparus dans l'API, par exemple, à propos de
CountDownLatch ,
CyclicBarrier ,
ConcurrentHashMap
et bien d'autres. Le livre leur a servi d'introduction déboguée pour travailler avec ces outils et a expliqué comment les utiliser pour écrire des applications Java compétitives hautes performances.
C'est exactement l'idée générale de ce livre, et dans cette veine de nombreux développeurs vous le décriront si vous demandez «Comment aimez-vous« Java Concurrency in Practice »»? Cependant, je prends ce livre un peu différemment, et c'est pourquoi je le
recommande toujours à tous les nouveaux arrivants qui connaissent Java ou aux développeurs de niveau intermédiaire qui veulent apprendre des concepts liés à la concurrence.
Le matériel le plus important que ce livre vous présentera est des concepts clairs et les principes fondamentaux de la programmation compétitive, en particulier, la visibilité, la commande, la
sécurité des threads , l'
immuabilité , la concurrence, etc.
Elle explique également pourquoi, dans la plupart des cas, les applications Java concurrentes sont mal orthographiées, pourquoi les programmeurs Java font des erreurs courantes qui entraînent des problèmes de multithreading, notamment des conditions de concurrence critique, un blocage, un blocage actif, des interférences de mémoire et tout simplement des calculs incorrects.
Le livre utilise des émoticônes qui accompagnent la description de "comment le faire mal", avant de présenter au lecteur la solution correcte et de haute qualité au problème. Ainsi, le livre aide non seulement à traiter les idées fausses que de nombreux développeurs Java ont, mais aussi à inculquer à la communauté Java les bonnes informations sur la façon de travailler avec le multithreading et la concurrence.
Il ne fait aucun doute que le multithreading et la concurrence sont complexes. Ils ne sont pas faciles à implémenter correctement dans le code; il est également difficile à comprendre et à expliquer. Je connais beaucoup de programmeurs qui ne sont tout simplement pas en mesure de décrire visuellement comment différents threads interagissent avec le même élément de code, fonctionnant avec des données différentes.
Comme l'exemple de récursivité classique, le multithreading est très facile à pratiquer pour certains programmeurs, tandis que pour d'autres, le multithreading est difficile à comprendre et à appliquer dans un scénario d'application.
La plus grande contribution du livre Java Concurrency in Practice au développement du monde Java n'est pas de simplifier la concurrence, mais de fournir des informations vraies et précises à son sujet. Depuis lors, j'ai mené de nombreuses interviews et je sais que les programmeurs n'imaginent pas toujours assez précisément le dispositif de flux et comment ils fonctionnent.
De nombreux programmeurs qui ont même réussi à travailler avec Java pendant 4 à 5 ans ne comprennent pas
comment les variables volatiles sont organisées ; tout ce qu'ils savent, c'est que lorsque vous travaillez avec une variable mutable, vous devez vérifier à chaque comparaison quelle valeur est dans la mémoire principale. C'est vrai, mais seulement une partie de la vérité.
On ne leur a pas parlé du modèle de mémoire Java, de la manière dont une variable variable peut affecter l'ordre du code et l'exécution des instructions de calcul à sa base. Il s'agit d'utiliser la compilation dynamique (
JIT ) et la machine virtuelle Java (
JVM ) pour l'optimisation; une telle optimisation peut conduire à de subtiles erreurs logiques.
Les gens ne savent pas comment les variables mutables vous permettent de voir ce qui a été fait dans un thread avant d'accéder à une variable à partir d'un autre thread, etc. Tout le monde ne sait pas ce qu'est une barrière de mémoire et comment elle affecte la visibilité.
C'est à partir du livre Java Concurrency in Practice que de nombreux programmeurs Java ont étudié tous ces concepts. Je dois admettre que, moi-même, jusqu'à ce que je le lise, je me suis trompé à bien des égards sur de nombreux problèmes importants de multithreading et de concurrence, en particulier la séquence, la visibilité et les effets implicites des variables finales et de la publication en toute sécurité. Le livre m'a aidé à comprendre cela.
Soit dit en passant, si certaines sections du livre vous semblent un peu incompréhensibles - croyez-moi, pas à vous seul. Nous remercions ici le Dr Heinz Kabutz, qui a décrit le contenu du livre sous une forme simplifiée dans son cours
Java Concurrency in Practice Bundle .

Même si ce matériel vous semble trop compliqué, Heinz a un autre cours,
Mastering Threads , qui aide à comprendre le multithreading pour tout programmeur Java moyen.
Parlons maintenant de Java 8, c'est-à-dire de ce qui est passé de Java 1.5 à Java 8. De nombreux nouveaux outils sont apparus dans le JDK pour introduire la compétitivité et concevoir des applications Java plus compétitives. Le
pool de jonction de fourches est apparu dans JDK 7
et CompleteableFutures
dans Java 8. Il est beaucoup plus important que, à partir de Java 8, un nouveau style de programmation plus fonctionnel, doté d'
expressions lambda , soit corrigé.
Nous avons également des flux et des flux parallèles, permettant aux développeurs de profiter de la compétitivité sans la programmer. L'idée de prendre l'implémentation de la concurrence des développeurs d'applications et de la déléguer aux développeurs de l'API simplifie légèrement la situation de la concurrence en Java et réduit les risques de sa mise en œuvre.
Cela signifie également qu'en Java, vous pouvez effectuer des opérations en bloc dans plusieurs threads à l'aide de quelques méthodes, sans écrire une seule ligne de code liée aux threads, au mot clé synchronisé ou aux méthodes d'attente et de notification.
Sans aucun doute, tout développeur Java doit apprendre ces nouveaux outils afin de suivre le développement de la technologie - ce qui, bien sûr, aidera un livre comme
Modern Java In Action . Il vous présentera non seulement toutes les innovations du langage Java, mais vous aidera également à apprendre à les utiliser dans les tâches quotidiennes, à comprendre la motivation de ces innovations et à avoir une idée générale du langage Java moderne.

Bien que le livre Java Concurrency in Practice dans sa forme actuelle ne couvre pas tous ces concepts et outils importants, il reste néanmoins inestimable pour explorer les principales caractéristiques du langage Java liées aux
threads , à la
concurrence et au
multithreading .
Le livre de Götz est toujours une lecture incontournable pour tout développeur Java qui souhaite apprendre et maîtriser le multithreading et la compétitivité - les plus grandes forces de Java dans le développement d'applications.
Sur la base de ce qui précède, comme de nombreux développeurs Java du monde entier, j'aimerais voir l'édition mise à jour de Java Concurrency in Practice, qui prendrait en compte les outils et les méthodologies apparus dans Java 6, 7, 8, 9, 10 et peut-être même dans Java 11. Après tout, des versions mises à jour de
Java efficace et
des modèles de conception Head First sont apparues , couvrant Java 8 et montrant combien il est plus facile d'implémenter divers modèles en utilisant les nouvelles fonctionnalités de Java 8.