Avez-vous remarqué Race Condition in Java Multi-threading Concurrency Example? Comment y faire face?

Publié: 2019-12-11

avez-vous-remarqué-race-condition-in-java-multi-threading-concurrency-example

Il y a quelque temps, j'ai écrit un article sur Producer Consumer Example et comment mieux gérer les opérations de lecture/écriture en Java. Dans le même ordre d'idées, dans ce didacticiel, nous aborderons quelque chose sur Race Condition et Thread locking .

Si vous avez l'une des questions ci-dessous, vous êtes au bon endroit :

  • Exemple de condition de concurrence Java
  • exemple mutex java
  • multithreading – Qu'est-ce qu'une condition de concurrence ?
  • Conditions de course et sections critiques
  • Qu'est-ce que la condition de course ?
  • Comment gérer la condition de concurrence en Java avec l'exemple

Pourquoi la condition de concurrence en Java se produit-elle ?

La condition de concurrence en Java se produit lorsque two or more threads tentent de modifier/mettre à jour des données partagées en same time .

Jetons un coup d'œil à la logique du programme ci-dessous :

Il s'agit d'un exemple bancaire très simple dans lequel vous deposit et withdraw montants 100 times . Vous déposerez 100 $ au total 100 fois = 100 $ x 100 = 10 000 $ et vous retirerez 50 $ au total 100 fois = 50 $ x 100 = 5 000 $. À la fin du programme, vous devriez avoir 5 000 $ dans votre banque.

Voici les étapes :

  1. Créer la classe CrunchifyRaceCondition.java
  2. Créer la classe CrunchifyTransaction.java
  3. Créer la classe CrunchifyBankAccount.java
  4. Nous exécuterons la classe CrunchifyRaceCondition et elle commencera la boucle de dépôt et de retrait 100 fois.
  5. Nous allons l'exécuter with Synchronized block pour vérifier le résultat
  6. Nous allons l'exécuter without Synchronized block pour vérifier le résultat

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Veuillez vérifier les lignes 24 et 34 ci-dessus. Conservez ce mot-clé Synchronized et exécutez votre programme. Vous devriez voir le résultat correct comme vous le voyez dans l'image ci-dessous.

Mot-clé de bloc synchronisé Java - Crunchify

Supprimez maintenant le mot clé synchronized des lignes 24 et 34 et exécutez le même programme.

Vous devrez peut-être exécuter ce programme plusieurs fois pour voir un problème. En java, il n'y a aucune garantie que vous verrez la condition de course tout le temps.

Java sans mot-clé de bloc synchronisé - Crunchify

Si vous avez une application au niveau de l'entreprise et que vous parlez de millions de transactions par seconde, la condition de concurrence peut entraîner un désastre pour votre entreprise.

Maintenant, la question est de savoir comment éviter la condition de concurrence dans votre application Java ?

  1. Si la condition de concurrence est dans les mises à jour de certaines structures de données en mémoire partagées, vous devez synchroniser l'accès et les mises à jour de la structure de données de manière appropriée.
  2. Si la condition de concurrence est dans les mises à jour de votre base de données, vous devez restructurer votre SQL pour utiliser les transactions au niveau de granularité approprié.
  3. Ce n'est pas une mauvaise idée de faire des tests de charge avant de passer en production. Plus de charge peut provoquer une condition de course rare. Mieux vaut le réparer avant plutôt le réparer plus tard.
  4. Assurez-vous que vous n'avez pas de variable globale dans laquelle vous écrivez.
  5. En Java, chaque objet a un et un seul moniteur et mutex qui lui sont associés. Le moniteur unique a plusieurs portes, cependant, chacune indiquée par le mot-clé synchronized . Lorsqu'un thread passe sur le mot clé synchronized , il verrouille effectivement toutes les portes.
  6. Bien sûr, si un thread ne passe pas par le mot clé synchronized , il n'a pas verrouillé la porte, et un autre thread est libre d'intervenir à tout moment.