Czy zauważyłeś Race Condition w przykładzie wielowątkowej współbieżności Java? Jak sobie z tym poradzić?

Opublikowany: 2019-12-11

czy-zauważyłeś-warunek-wyścigu-w-java-przykład-wielowątkowości-współbieżności

Jakiś czas temu napisałem artykuł o Producer Consumer Example i jak lepiej obsługiwać operacje odczytu/zapisu w Javie. W podobnym tonie, w tym samouczku omówimy coś na temat Race Condition i Thread locking .

Jeśli masz jakiekolwiek z poniższych pytań, jesteś we właściwym miejscu:

  • Przykład warunków wyścigu w Javie
  • przykład mutex java
  • wielowątkowość – co to jest wyścig?
  • Warunki wyścigu i sekcje krytyczne
  • Co to jest stan wyścigu?
  • Jak radzić sobie z Race Condition w Javie z przykładem

Dlaczego występuje sytuacja wyścigowa w Javie?

Sytuacja wyścigu w Javie występuje, gdy two or more threads same time próbuje zmodyfikować/zaktualizować współdzielone dane.

Rzućmy okiem na poniższą logikę programu:

To bardzo prosty przykład bankowy, w którym będziesz deposit i withdraw kwoty 100 times . Wpłacisz 100 $ w sumie 100 razy = 100 $ x 100 = 10 000 $ i wypłacisz łącznie 50 $ 100 razy = 50 $ x 100 = 5000 $. Po zakończeniu programu powinieneś mieć w swoim banku 5000 $.

Oto kroki:

  1. Utwórz klasę CrunchifyRaceCondition.java
  2. Utwórz klasę CrunchifyTransaction.java
  3. Utwórz klasę CrunchifyBankAccount.java
  4. Uruchomimy klasę CrunchifyRaceCondition, która uruchomi pętlę wpłat i wypłat 100 razy.
  5. Uruchomimy go with Synchronized block aby sprawdzić wynik
  6. Uruchomimy go without Synchronized block aby sprawdzić wynik

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Sprawdź wiersz 24 i 34 powyżej. Zachowaj to Synchronized słowo kluczowe i uruchom swój program. Powinieneś zobaczyć poprawny wynik, jak widać na poniższym obrazku.

Słowo kluczowe zsynchronizowanego bloku Java - Crunchify

Teraz usuń zsynchronizowane słowo kluczowe z linii 24 i 34 i uruchom ten sam program.

Może być konieczne wielokrotne uruchomienie tego programu, aby zobaczyć problem. W javie nie ma gwarancji, że cały czas będziesz widzieć stan wyścigu.

Java bez słowa kluczowego zsynchronizowanego bloku - Crunchify

Jeśli masz aplikację na poziomie korporacyjnym i mówisz o milionach transakcji na sekundę, wyścig może spowodować katastrofę dla Twojej firmy.

Teraz pytanie brzmi, jak uniknąć Race Condition w swojej aplikacji Java?

  1. Jeśli sytuacja wyścigu dotyczy aktualizacji niektórych współużytkowanych struktur danych w pamięci, należy odpowiednio zsynchronizować dostęp i aktualizacje struktury danych.
  2. Jeśli sytuacja wyścigu dotyczy aktualizacji bazy danych, musisz zmienić strukturę swojego kodu SQL, aby używać transakcji na odpowiednim poziomie szczegółowości.
  3. Nie jest złym pomysłem przeprowadzenie testów obciążenia przed uruchomieniem w środowisku produkcyjnym. Większe obciążenie może powodować rzadki stan wyścigu. Lepiej to naprawić, a dopiero później naprawić.
  4. Upewnij się, że nie masz zmiennej globalnej, do której piszesz.
  5. W Javie każdy obiekt ma jeden i tylko jeden powiązany z nim monitor i muteks. Pojedynczy monitor ma jednak kilka drzwi, z których każde wskazuje słowo kluczowe synchronized . Kiedy wątek przechodzi przez synchronized słowo kluczowe, skutecznie blokuje wszystkie drzwi.
  6. Oczywiście, jeśli wątek nie przechodzi przez synchronized słowo kluczowe, nie zablokował drzwi, a jakiś inny wątek jest w każdej chwili wolny.