هل لاحظت حالة السباق في مثال التزامن متعدد خيوط جافا؟ كيفية التعامل معها؟

نشرت: 2019-12-11

هل لاحظت حالة السباق في جافا متعددة الخيوط على التزامن

في وقت ما ، كتبت مقالًا عن مثال المستهلك المنتج وكيفية التعامل مع عملية القراءة / الكتابة بطريقة أفضل في Java. في ملاحظة مماثلة ، سنناقش في هذا البرنامج التعليمي شيئًا عن Race Condition Thread locking .

إذا كان لديك أي من الأسئلة التالية ، فأنت في المكان الصحيح:

  • مثال على حالة سباق جافا
  • مثال على جافا كائنات المزامنة
  • multithreading - ما هي حالة السباق؟
  • ظروف السباق والأقسام الحرجة
  • ما هي حالة السباق؟
  • كيفية التعامل مع حالة العرق في Java مع مثال

لماذا تحدث حالة العرق في جافا؟

تحدث حالة العرق في Java عندما يحاول two or more threads تعديل / تحديث البيانات المشتركة في same time .

دعنا نلقي نظرة على منطق البرنامج أدناه:

هذا مثال مصرفي بسيط للغاية حيث ستقوم deposit withdraw المبالغ 100 times . ستقوم بإيداع 100 دولار إجمالاً 100 مرة = 100 دولار × 100 = 10000 دولار وستسحب 50 دولارًا إجماليًا 100 مرة = 50 دولارًا × 100 = 5000 دولار. في نهاية البرنامج ، يجب أن يكون لديك 5000 دولار في البنك الذي تتعامل معه.

فيما يلي الخطوات:

  1. قم بإنشاء فئة CrunchifyRaceCondition.java
  2. قم بإنشاء فئة CrunchifyTransaction.java
  3. قم بإنشاء فئة CrunchifyBankAccount.java
  4. سنقوم بتشغيل class CrunchifyRaceCondition وسيبدأ إيداع وسحب الحلقة 100 مرة.
  5. سنقوم بتشغيله with Synchronized block للتحقق من النتيجة
  6. سنقوم بتشغيله without Synchronized block للتحقق من النتيجة

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

يرجى مراجعة السطر 24 و 34 أعلاه. احتفظ بهذه الكلمة الأساسية Synchronized وقم بتشغيل برنامجك. يجب أن ترى النتيجة الصحيحة كما تراها في الصورة أدناه.

جافا الكلمات الرئيسية المتزامنة بلوك - Crunchify

الآن قم بإزالة الكلمات الأساسية المتزامنة من السطر 24 و 34 وقم بتشغيل نفس البرنامج.

قد تحتاج إلى تشغيل هذا البرنامج عدة مرات لمعرفة المشكلة. في جافا ليس هناك ما يضمن أنك سترى حالة السباق في جميع الأوقات.

جافا دون الكلمات الرئيسية المتزامنة بلوك - Crunchify

إذا كان لديك تطبيق على مستوى المؤسسة وتتحدث عن ملايين المعاملات في الثانية ، فقد تتسبب حالة السباق في كارثة لشركتك.

السؤال الآن هو كيف تتجنب حالة العرق في تطبيق Java الخاص بك؟

  1. إذا كانت حالة السباق قيد التحديثات على بعض هياكل البيانات المشتركة في الذاكرة ، فأنت بحاجة إلى مزامنة الوصول والتحديثات إلى بنية البيانات بالطريقة المناسبة.
  2. إذا كانت حالة السباق في تحديثات لقاعدة البيانات الخاصة بك ، فأنت بحاجة إلى إعادة هيكلة SQL الخاص بك لاستخدام المعاملات على المستوى المناسب من التفاصيل.
  3. ليس من الجيد إجراء اختبار التحميل قبل بدء الإنتاج. قد يتسبب المزيد من الحمل في حدوث حالة سباق نادرة. من الأفضل إصلاحه قبل إصلاحه لاحقًا.
  4. تأكد من عدم وجود متغير عام تكتب إليه.
  5. في Java ، يحتوي كل كائن على شاشة واحدة ومفتاح كائن واحد فقط مرتبط به. تحتوي الشاشة الفردية على عدة أبواب بداخلها ، ومع ذلك ، يُشار إلى كل منها بالكلمة الرئيسية synchronized . عندما يمر خيط فوق الكلمة الأساسية synchronized ، فإنه يقفل جميع الأبواب بشكل فعال.
  6. بالطبع ، إذا لم يمر الخيط عبر الكلمة الأساسية synchronized ، فإنه لم يغلق الباب ، وبعض الخيوط الأخرى عبارة عن مداخلة مجانية في أي وقت.