Maison  >  Article  >  Java  >  Concurrence en Java

Concurrence en Java

PHPz
PHPzoriginal
2024-08-30 16:18:26297parcourir

Dans le monde d’aujourd’hui, tout évolue rapidement. Il y a toujours place à l’amélioration dans chaque chose. C’est le cas de notre langage de programmation. Aujourd’hui, grâce à nos technologies modernes, nous nous attendons à ce que les choses soient faites facilement et rapidement. Pour faire plusieurs choses simultanément, le concept de concurrence est apparu. Alors, qu’est-ce que la simultanéité, son utilisation, pourquoi est-elle nécessaire, et bien d’autres encore ? Nous essaierons d'aborder ces questions et d'y répondre individuellement dans cet article. Amenons donc notre discussion à une section commune très basique : la définition de la concurrence. Dans cette rubrique, nous allons découvrir ce qu'est la concurrence en Java.

Concurrence en Java

Commencez votre cours de développement de logiciels libres

Développement Web, langages de programmation, tests de logiciels et autres

Définition de la concurrence ?

Alors, qu’est-ce que la simultanéité ? Eh bien, pour répondre à cela, prenons un scénario courant. Supposons qu'en lisant cet article, vous essayiez de faire plusieurs choses simultanément ; peut-être que vous essayez de prendre une note, ou peut-être que vous essayez de la comprendre ou de réfléchir à certaines choses. En termes simples, vous essayez de faire plusieurs choses en parallèle. C'est ce que signifie la concurrence. La concurrence consiste simplement à exécuter plusieurs tâches parallèlement les unes aux autres. Nous discuterons de la concurrence dans cet article dans le cadre de Java en tant que langage de programmation.

En attendant, ayons une définition de base du fil. En fait, en Java ou en général, dans n'importe quel langage de programmation, c'est le thread chargé de gérer la concurrence. Le rôle fondamental de ces threads est de faciliter l'exécution parallèle des tâches.

Alors, qu'est-ce qu'un fil de discussion ?

Un thread est un processus léger avec sa propre pile d'appels. Cependant, un thread peut accéder aux données partagées à partir d'autres threads s'exécutant sous le même processus. Nous pouvons utiliser de nombreux threads dans une application Java pour réaliser un traitement parallèle ou une simultanéité.

Passons maintenant à notre prochain sujet, qui est…

Concurrence dans la définition Java ?

Ainsi, tous les langages POO ont un concept de threading en Java ou dans tout autre langage de programmation comme C#. En Java, nous avons différents processus qui s'exécutent en créant différents threads pour obtenir la concurrence.

Alors après cette simple définition, abordons notre nouveau sujet, qui est :

Qu'est-ce qui rend les applications Java concurrentes ?

La première classe dont on a besoin pour rendre concurrente une application Java est la classe java.lang.Thread. La classe Java.lang.Thread est responsable de tous les concepts de concurrence dans le langage de programmation Java. Après cela, nous avons l'interface java.lang.Runnable pour extraire le comportement du thread de la classe thread.

D'autres classes dans lesquelles nous aurons besoin de construire une application avancée seront utilisées à partir du package java.util.concurrent ajouté dans Java 1.5.

Maintenant avec cela, nous avons atteint une nouvelle question qui est…

La concurrence Java est-elle vraiment aussi simple ?

Il semble que la mise en œuvre de la concurrence en Java soit assez simple. Cependant, ce n’est vraiment pas le cas. Voyons-y.

Notre discussion ci-dessus donne généralement l'impression que la concurrence est un concept simple, bon et assez facile à mettre en œuvre. Eh bien, supposons que nous le surveillons mieux et essayons de le comprendre. Dans ce cas, cela nécessite une bonne compréhension des concepts de base et une compréhension approfondie de ce que nous devons réaliser.

Comparons les applications simultanées et les applications monothread. Nous constatons généralement qu’une application concurrente est complexe en termes de conception et de compréhension. Le code exécuté par plusieurs threads nécessite une attention et des ressources particulières pour accéder aux données partagées. Les erreurs qui apparaissent en raison d'une synchronisation incorrecte des threads sont difficiles à déboguer et à corriger. De plus, dans la plupart des scénarios, ces bugs ne sont pas identifiés dès la phase initiale ; il est détecté en mode prod, ce qui est encore plus difficile à reproduire.

Mis à part les bugs et les défauts courants, les threads simultanés nécessitent plus de ressources pour exécuter l'application.

Problèmes et amélioration de la concurrence – Explication avec exemple

Donc, fondamentalement, il existe deux types de problèmes attribués en raison de la concurrence. Ces problèmes peuvent être globalement classés en deux catégories

  • Erreurs d'interférence de thread
  • Erreurs de cohérence de la mémoire

Comprenons chacun.

Erreurs d'interférence de thread

Comprenons avec un exemple simple.

Supposons que nous ayons une fonction de compteur dont le rôle fondamental est d'augmenter le compteur ou le décompte d'un nombre. Supposons que nous ayons le thread A et le thread B, et que le thread A lit la valeur initiale comme 0. Maintenant, les étapes suivantes s'exécutent séquentiellement.

  1. Le fil A lit la valeur initiale comme 0
  2. Le fil B lit la valeur initiale comme 0
  3. Thread A augmente la valeur de 1. La nouvelle valeur est maintenant 1
  4. Le fil B augmente également, en parallèle, la valeur à 1.
  5. Le thread A écrit une valeur mise à jour qui est 1, dans la cellule mémoire
  6. Le fil B répète également la même étape, qui est écrite dans la cellule mémoire avec une valeur mise à jour de 1

Alors là le problème se pose. Deux threads, A et B, exécutent le code deux fois et la valeur attendue est 2, mais elle est reflétée par 1. C'est le principal problème que plusieurs threads pourraient causer.

Comment cela pourrait-il être résolu ?

Les erreurs d'interférence de thread peuvent être résolues en synchronisant l'accès aux variables partagées. Nous devons rester synchronisés avec les valeurs mises à jour entre les données partagées.

Sur ce, examinons le deuxième type d'erreur…

Erreurs de cohérence de la mémoire

Des erreurs d'incohérence de mémoire se produisent généralement lorsque différents threads tentent de lire ou ont des vues incohérentes sur le même élément de données. Cela se produit généralement lorsque le premier thread met à jour certaines données partagées. Cette valeur mise à jour n'est pas propagée aux deuxièmes threads ou à des threads différents, et ils lisent les anciennes données.

Voyons pourquoi cela se produit.

Eh bien, il peut y avoir plusieurs causes à cela. Habituellement, le compilateur effectue plusieurs optimisations de l'application pour améliorer les performances. Il peut également mettre à jour les séquences d'instructions pour optimiser les performances. Même de manière générale, les processeurs tentent également d'optimiser les codes ; par exemple, un processeur peut lire la valeur actuelle d'une variable à partir de la mémoire cache ou d'un registre temporaire au lieu de la mémoire principale.

Conclusion

La concurrence est une fonctionnalité très importante de tout langage POO. Le threading nous permet d'exécuter plusieurs processus en parallèle les uns des autres. Cela nous aide à exécuter nos tâches complexes plus rapidement. Cependant, la simultanéité présente également quelques avantages. L'utilisation du threading entraîne une forte utilisation des ressources.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn