Qu'est-ce que la concurrence en Java? - Guide complet de la concurrence en Java

Table des matières:

Anonim

Qu'est-ce que la concurrence en Java?

Dans le monde d'aujourd'hui, tout se développe rapidement. Il y a toujours une marge d'amélioration dans chacun et tout. C'est le cas de notre langage de programmation. Aujourd'hui, avec nos technologies modernes, nous nous attendons à ce que les choses se fassent avec facilité et rapidité. Pour faire plusieurs choses en même temps ou pour faire plusieurs choses simultanément, le concept de concurrence est apparu. Alors, quelle est réellement la concurrence, quelle est son utilisation, pourquoi est-ce vraiment nécessaire et bien d'autres. Nous allons essayer de toucher ces questions et d'y répondre une par une dans cet article. Alors, apportons notre discussion à une section commune très basique qui est la définition de la concurrence. Dans cette rubrique, nous allons découvrir ce qu'est la concurrence en Java.

Définition de la simultanéité?

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

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

Alors qu'est-ce qu'un fil?

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

Passons maintenant au sujet suivant, qui est:

Concurrence dans la définition Java?

Ainsi, en Java ou dans tout autre langage de programmation comme C #, etc., tout le langage OOP a un concept de threading. En Java, nous avons différents processus qui s'exécutent en créant différents threads pour atteindre la concurrence

Donc, après cette définition simple, discutons de notre nouveau sujet qui est:

Qu'est-ce qui rend l'application Java simultanée?

La première classe, dont on a besoin pour faire une application java simultanée, 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 une interface java.lang.Runnable pour abstraire le comportement des threads de la classe des threads.

Une autre classe dont nous aurons besoin pour construire une application avancée sera utilisée à 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 que cela?

Comme il semble que l'implémentation de la simultanéité en Java est assez simple. Mais ce n'est vraiment pas le cas. Voyons voir.

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

Si nous comparons des applications simultanées et une application à thread unique, nous constatons généralement qu'une application simultanée est complexe en termes de conception et de compréhension. Le code exécuté par plusieurs threads nécessite une attention particulière et des ressources pour accéder aux données partagées. Les erreurs qui surviennent en raison d'une synchronisation incorrecte des threads sont difficiles à déboguer et à corriger. De plus, dans la plupart des scénarios, ces bogues ne sont pas identifiés dans la phase initiale, en fait, ils sont détectés en mode prod qui est encore plus difficile à reproduire.

Outre les bogues 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 simultanéité - Explication avec l'exemple

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

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

Laissez-nous comprendre chacun par un

Erreurs d'interférence de thread - Comprenons-nous avec un exemple simple.

Supposons que nous ayons une fonction de compteur, dont le rôle de base est d'augmenter le compteur ou le nombre d'un nombre. Supposons maintenant que nous avons deux threads, le thread A et le thread B. Supposons que le thread A lit la valeur initiale comme 0. Maintenant, les étapes suivantes s'exécutent de manière séquentielle.

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

Voici donc le problème. Deux threads A et B, exécutez le code deux fois et la valeur attendue est 2 mais ce qui est reflété est 1. C'est le principal problème que peuvent causer plusieurs threads

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 pour les valeurs mises à jour entre les données partagées

Avec cela, penchons-nous sur le deuxième type d'erreur

Erreurs de cohérence de la mémoire

Les erreurs d'incohérence de la mémoire se produisent généralement lorsque différents threads essaient 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 et que cette valeur mise à jour n'est pas propagée au second thread ou à des threads différents, et qu'ils lisent d'anciennes données.

Voyons pourquoi cela se produit?

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

Conclusion - Qu'est-ce que la concurrence en Java?

La concurrence est une caractéristique très importante de tout langage de POO. Le threading nous donne la possibilité d'exécuter plusieurs processus en parallèle les uns aux autres. Il nous aide à exécuter notre tâche complexe plus rapidement. Cependant, avec les avantages, la simultanéité a aussi peu d'inconvénients. L'utilisation de threads entraîne une utilisation intensive des ressources

Articles recommandés

Cela a été un guide sur ce qu'est la concurrence en Java. Ici, nous avons discuté des problèmes et de l'amélioration de la concurrence avec un exemple. Vous pouvez également consulter nos autres articles suggérés pour en savoir plus -

  1. Qu'est-ce que le multithreading en Java?
  2. Comment connecter une base de données en Java?
  3. Qu'est-ce que le multithreading en Java?
  4. Qu'est-ce que J2EE?