أولوية مؤشر ترابط Java <br /> النوع الخاص من الخطأ المتعلق بمهام متعددة يجب تجنبه هو Deadlock. يحدث Deadlock عندما يكون لخيوط اثنين تبعية دائرية على زوج من الكائنات المتزامنة. على سبيل المثال ، لنفترض أن مؤشر ترابط واحد يدخل خط أنابيب الكائن x ويدخل مؤشر ترابط آخر إلى خط أنابيب الكائن Y. إذا حاول مؤشر ترابط X استدعاء طريقة مزامنة Y ، فسيتم قفله كما هو متوقع. يريد مؤشر ترابط Y أيضًا استدعاء بعض طرق التزامن لـ X ، وينتظر مؤشر الترابط إلى الأبد ، لأنه من أجل الوصول إلى X ، يجب أن يصدر قفل Y الخاص به لجعل الخيط الأول مكتملًا. Deadlock هو خطأ صعب للغاية في التصحيح لأن:
عادةً ما يحدث ذلك ، ويحدث ذلك فقط عندما تتطابق الفترة الزمنية للموضوعين فقط.
قد يحتوي على أكثر من خيطين وكائنات متزامنة (أي ، يمكن أن تحدث Deadlocks عندما تكون هناك تسلسل أكثر تعقيدًا للأحداث من المثال الموصوف للتو).
لفهم الجمود تمامًا ، من المفيد مراقبة سلوكها. يولد المثال التالي فئتين ، A و B ، مع طرق FOO () و BAR () على التوالي. هاتان الطريقتان لهما توقف مؤقت موجز قبل استدعاء طرق الفصول الأخرى. تقوم الفصل الرئيسي ، المسمى Deadlock ، بإنشاء مثيلات من A و B ، ثم تبدأ موضوعًا ثانيًا لإعداد بيئة مميتة. تستخدم طرق FOO () و BAR () Sleep () لفرض Deadlock.
// مثال على ديدلوك. Thould .sleep (1000) ؛ () ؛ System n (name + "محاولة استدعاء A.Last () ؛ {a = new () ؛ () ؛ احصل على قفل ب في موضوع آخر. بعد تشغيل البرنامج ، يكون الإخراج كما يلي:
دخل MainThread A.FooracingThread دخل B.BarmainThread محاولة استدعاء B.Last () RacingThread محاولة الاتصال A.Last ()
نظرًا لأن البرنامج مسدود ، فأنت بحاجة إلى الضغط على CTRL-C لإنهاء البرنامج. اضغط على Ctrl-Break على جهاز الكمبيوتر (أو اضغط على Ctrl-/ تحت Solaris) ويمكنك رؤية الخيط الكامل وكومة خط الأنابيب. سترى أن RacingThread تحتل عملية الإدارة B أثناء انتظار عملية الإدارة A ، وفي الوقت نفسه ، تحتل MainThread عملية الإدارة ب. لن ينتهي البرنامج أبدًا. كما يوضح هذا المثال ، غالبًا ما يتم قفل برنامجك المتعدد ، ويكون Deadlock هو العدد الأول الذي يجب عليك التحقق منه.
java thread deadlock <br /> النوع الخاص من الخطأ المتعلق بمهام المتعددة التي يجب تجنبها هو deadlock. يحدث Deadlock عندما يكون لخيوط اثنين تبعية دائرية على زوج من الكائنات المتزامنة. على سبيل المثال ، لنفترض أن مؤشر ترابط واحد يدخل خط أنابيب الكائن x ويدخل مؤشر ترابط آخر إلى خط أنابيب الكائن Y. إذا حاول مؤشر ترابط X استدعاء طريقة مزامنة Y ، فسيتم قفله كما هو متوقع. يريد مؤشر ترابط Y أيضًا استدعاء بعض طرق التزامن لـ X ، وينتظر مؤشر الترابط إلى الأبد ، لأنه من أجل الوصول إلى X ، يجب أن يصدر قفل Y الخاص به لجعل الخيط الأول مكتملًا. Deadlock هو خطأ صعب للغاية في التصحيح لأن:
عادةً ما يحدث ذلك ، ويحدث ذلك فقط عندما تتطابق الفترة الزمنية للموضوعين فقط.
قد يحتوي على أكثر من خيطين وكائنات متزامنة (أي ، يمكن أن تحدث Deadlocks عندما تكون هناك تسلسل أكثر تعقيدًا للأحداث من المثال الموصوف للتو).
لفهم الجمود تمامًا ، من المفيد مراقبة سلوكها. يولد المثال التالي فئتين ، A و B ، مع طرق FOO () و BAR () على التوالي. هاتان الطريقتان لهما توقف مؤقت موجز قبل استدعاء طرق الفصول الأخرى. تقوم الفصل الرئيسي ، المسمى Deadlock ، بإنشاء مثيلات من A و B ، ثم تبدأ موضوعًا ثانيًا لإعداد بيئة مميتة. تستخدم طرق FOO () و BAR () Sleep () لفرض Deadlock.
// مثال على ديدلوك. Thould .sleep (1000) ؛ () ؛ System n (name + "محاولة استدعاء A.Last () ؛ {a = new () ؛ () ؛ احصل على قفل ب في موضوع آخر. بعد تشغيل البرنامج ، يكون الإخراج كما يلي:
دخل MainThread A.FooracingThread دخل B.BarmainThread في محاولة لدعوة B.Last () RacingThread محاولة الاتصال A.Last ()
نظرًا لأن البرنامج مسدود ، فأنت بحاجة إلى الضغط على CTRL-C لإنهاء البرنامج. اضغط على Ctrl-Break على الكمبيوتر (أو اضغط على Ctrl-/ تحت Solaris) ويمكنك رؤية الخيط الكامل وكومة خط الأنابيب. سترى أن RacingThread تحتل عملية الإدارة B أثناء انتظار عملية الإدارة A ، وفي الوقت نفسه ، تحتل MainThread عملية الإدارة ب. لن ينتهي البرنامج أبدًا. كما يوضح هذا المثال ، غالبًا ما يتم قفل برنامجك المتعدد ، ويكون Deadlock هو العدد الأول الذي يجب عليك التحقق منه.