Java Multi-threading Concurrency Örneğinde Yarış Koşullarını fark ettiniz mi? Nasıl başa çıkılır bununla?

Yayınlanan: 2019-12-11

var-fark ettiniz-yarış-koşulu-in-java-çoklu iş parçacığı-eşzamanlılık-örnek

Bir süre önce, Üretici Tüketici Örneği ve Java'da okuma/yazma işleminin daha iyi nasıl ele alınacağı hakkında bir makale yazdım. Benzer bir notta, bu eğitimde Race Condition ve Thread locking hakkında bir şeyler tartışacağız.

Aşağıdaki sorulardan herhangi birine sahipseniz doğru yerdesiniz:

  • Java yarış durumu örneği
  • muteks java örneği
  • multithreading – Yarış durumu nedir?
  • Yarış Koşulları ve Kritik Bölümler
  • Yarış durumu nedir?
  • Örnek ile Java'da Yarış Durumu ile nasıl başa çıkılır

Java'da Yarış Durumu Neden Oluşur?

Java'daki yarış durumu, two or more threads same time paylaşılan verileri değiştirmeye/güncellemeye çalıştığında oluşur.

Aşağıdaki Program mantığına bir göz atalım:

Bu, 100 times para deposit withdraw çok basit bir bankacılık örneğidir. Toplam 100$'ı 100 defa yatıracaksınız = 100$ x 100 = 10.000$ ve toplam 50$'ı 100 defa çekeceksiniz = 50$ x 100 = 5.000$. Programın tamamlanmasının sonunda bankanızda 5000$ olmalıdır.

İşte adımlar:

  1. CrunchifyRaceCondition.java sınıfını oluşturun
  2. CrunchifyTransaction.java sınıfını oluşturun
  3. CrunchifyBankAccount.java sınıfını oluşturun
  4. CrunchifyRaceCondition sınıfını çalıştıracağız ve 100 kez para yatırma ve çekme döngüsüne başlayacak.
  5. Sonucu kontrol etmek için with Synchronized block çalıştıracağız
  6. Sonucu kontrol etmek için without Synchronized block çalıştıracağız

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Lütfen yukarıdaki 24. ve 34. satırları kontrol edin. Synchronized anahtar kelimeyi saklayın ve programınızı çalıştırın. Aşağıdaki resimde gördüğünüz gibi doğru sonucu görmelisiniz.

Java Senkronize Blok Anahtar Kelimesi - Crunchify

Şimdi 24. ve 34. satırdan senkronize edilmiş anahtar kelimeyi kaldırın ve aynı programı çalıştırın.

Bir sorunu görmek için bu programı birden çok kez çalıştırmanız gerekebilir. Java'da her zaman Yarış durumunu göreceğinizin garantisi yoktur.

Senkronize Blok Anahtar Kelimesi olmayan Java - Crunchify

Kurumsal düzeyde bir uygulamanız varsa ve saniyede milyonlarca işlemden bahsediyorsanız, yarış durumu şirketiniz için felakete neden olabilir.

Şimdi soru şu: Java Uygulamanızda Yarış Durumundan nasıl kaçınılır?

  1. Yarış durumu, bazı paylaşılan bellek içi veri yapılarında güncellemelerdeyse, veri yapısına erişimi ve güncellemeleri uygun şekilde senkronize etmeniz gerekir.
  2. Yarış koşulu, veritabanınızdaki güncellemelerdeyse, işlemleri uygun ayrıntı düzeyinde kullanmak için SQL'inizi yeniden yapılandırmanız gerekir.
  3. Üretimde canlı yayına geçmeden önce Yük testi yapmak kötü bir fikir değildir. Daha fazla yük, nadir Yarış Durumuna neden olabilir. Daha sonra düzeltmektense önce düzeltmek daha iyidir.
  4. Yazdığınız global bir değişkeniniz olmadığından emin olun.
  5. Java'da, her nesnenin kendisiyle ilişkilendirilmiş bir ve yalnızca bir monitörü ve mutex'i vardır. Tek monitörün içinde birkaç kapı vardır, ancak her biri synchronized anahtar kelimeyle belirtilir. Bir iş parçacığı synchronized anahtar sözcüğünü geçtiğinde, tüm kapıları etkin bir şekilde kilitler.
  6. Elbette, bir iş parçacığı synchronized anahtar sözcüğünü geçmezse, kapıyı kilitlememiştir ve başka bir iş parçacığı herhangi bir zamanda ücretsiz olarak girebilmektedir.