Haben Sie eine Race-Bedingung im Java-Beispiel für Multi-Threading-Parallelität bemerkt? Wie man damit umgeht?

Veröffentlicht: 2019-12-11

hast-du-bemerkt-race-condition-in-java-multi-threading-concurrency-example

Vor einiger Zeit habe ich einen Artikel über Producer Consumer Example geschrieben und wie man Lese-/Schreibvorgänge in Java besser handhabt. In ähnlicher Weise werden wir in diesem Tutorial etwas über Race Condition und Thread locking besprechen.

Wenn Sie eine der folgenden Fragen haben, dann sind Sie hier genau richtig:

  • Beispiel für eine Java-Rennbedingung
  • Mutex-Java-Beispiel
  • Multithreading – Was ist eine Race Condition?
  • Rennbedingungen und kritische Abschnitte
  • Was ist Race-Condition?
  • Umgang mit Race Condition in Java mit Beispiel

Warum tritt Race Condition in Java auf?

Eine Racebedingung in Java tritt auf, wenn two or more threads same time versuchen, gemeinsam genutzte Daten zu ändern/aktualisieren.

Werfen wir einen Blick auf die folgende Programmlogik:

Dies ist ein sehr einfaches Bankbeispiel, bei dem Sie 100 times Beträge deposit und withdraw . Sie werden insgesamt 100 Mal 100 $ einzahlen = 100 $ x 100 = 10.000 $ und Sie werden 100 Mal insgesamt 50 $ abheben = 50 $ x 100 = 5.000 $. Am Ende des Programmabschlusses sollten Sie 5000 $ auf Ihrer Bank haben.

Hier sind die Schritte:

  1. Erstellen Sie die Klasse CrunchifyRaceCondition.java
  2. Erstellen Sie die Klasse CrunchifyTransaction.java
  3. Erstellen Sie die Klasse CrunchifyBankAccount.java
  4. Wir werden die Klasse CrunchifyRaceCondition ausführen und sie wird die Ein- und Auszahlungsschleife 100 Mal starten.
  5. Wir werden es with Synchronized block ausführen, um das Ergebnis zu überprüfen
  6. Wir werden es without Synchronized block ausführen, um das Ergebnis zu überprüfen

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Bitte überprüfen Sie die Zeilen 24 und 34 oben. Behalten Sie das Schlüsselwort Synchronized bei und führen Sie Ihr Programm aus. Sie sollten das korrekte Ergebnis sehen, wie Sie es im folgenden Bild sehen.

Java Synchronized Block Keyword - Crunchify

Entfernen Sie nun das Schlüsselwort „synced“ aus den Zeilen 24 und 34 und führen Sie dasselbe Programm aus.

Möglicherweise müssen Sie dieses Programm mehrmals ausführen, um ein Problem zu sehen. In Java gibt es keine Garantie, dass Sie Race Condition immer sehen.

Java ohne synchronisiertes Block-Schlüsselwort - Crunchify

Wenn Sie eine Anwendung auf Unternehmensebene haben und von Millionen von Transaktionen pro Sekunde sprechen, kann die Race Condition eine Katastrophe für Ihr Unternehmen verursachen.

Nun stellt sich die Frage, wie Sie Race Condition in Ihrer Java-Anwendung vermeiden können.

  1. Wenn die Racebedingung in Aktualisierungen einiger gemeinsam genutzter In-Memory-Datenstrukturen auftritt, müssen Sie den Zugriff und die Aktualisierungen auf die Datenstruktur auf geeignete Weise synchronisieren.
  2. Wenn die Racebedingung in Aktualisierungen Ihrer Datenbank auftritt, müssen Sie Ihre SQL neu strukturieren, um Transaktionen mit der entsprechenden Granularitätsebene zu verwenden.
  3. Es ist keine schlechte Idee, Lasttests durchzuführen, bevor Sie in die Produktion gehen. Mehr Last kann seltene Race Condition verursachen. Reparieren Sie es besser, bevor Sie es später reparieren.
  4. Stellen Sie sicher, dass Sie keine globale Variable haben, in die Sie schreiben.
  5. In Java ist jedem Objekt ein und nur ein Monitor und Mutex zugeordnet. Der einzelne Monitor enthält jedoch mehrere Türen, die jeweils durch das Schlüsselwort synchronized “ gekennzeichnet sind. Wenn ein Thread das synchronized Schlüsselwort passiert, sperrt er effektiv alle Türen.
  6. Wenn ein Thread das synchronized Schlüsselwort nicht passiert, hat er die Tür natürlich nicht verschlossen, und ein anderer Thread kann jederzeit frei hereinplatzen.