طريق مسدود
المسمار هو أداة مفيدة للغاية مع العديد من التطبيقات لأنها بسيطة للغاية للاستخدام وسهل الفهم. ولكن في الوقت نفسه ، سوف يجلب أيضًا بعض المشاكل ، أي أنه قد يتسبب في طريق مسدود. بمجرد حدوث مضيق ، ستكون وظائف النظام غير متوفرة. دعونا أولاً نلقي نظرة على قطعة من التعليمات البرمجية ، والتي ستتسبب في حدوث طريق مسدود ، مما يؤدي إلى انتظار Thread_1 و Thread_2 لانتظار بعضهما البعض لإطلاق القفل.
حزمة سلسلة رسائل حزمة ؛ فئة عامة deadlockDemo {private static string a = "a" ؛ سلسلة ثابتة خاصة b = "b" ؛ public static void main (string args []) {new DeadlockDemo (). deadlock () ؛ {system.err.println ("-thread_1 lock a -----") ؛ synchronized (b) {system.err.println ("-thread_1 lock b -------") ؛}}}}}) ؛ // thread indight_2 = new thread (new runnable ( {system.out.println ("-thread_2 lock b -----") ؛ synchronized (a) {system.out.println ("-thread_2 lock a -----") ؛}}}}) ؛ thread_1.start () ؛ thread_2.start () ؛}}}}}}}}}}}}}}}}}}}}}}}}}}}}}هذا الرمز هو مجرد عرض لسيناريوهات Deadlock ، وفي الواقع قد لا تكتب مثل هذا الرمز. ولكن في بعض السيناريوهات الأكثر تعقيدًا ، قد تواجه مثل هذه المشكلات ، مثل Thread_1 لم تصدر الكابل لأن بعض المواقف غير الطبيعية (حلقة ميتة). أو يحصل Thread_1 على كبل قاعدة بيانات ، ويتم إلقاء استثناء عند إطلاق القفل ، ولكن لم يتم إصداره.
بمجرد حدوث طريق مسدود ، يكون العمل محسوسًا لأنه لا يمكن تقديم الخدمة. ثم يمكنك فقط التحقق من الموضوع الذي لديه المشكلة من خلال مؤشر ترابط التفريغ. تخبرنا معلومات الخيط التالية أن الخطوط 35 و 21 من فئة DeadlockDemo تسببت في طريق مسدود.
"Thread -1" prio = 6 tid = 0x000000000cb13800 nid = 0x19ac في انتظار إدخال الشاشة [0 x000000000d67f000] java.lang.string) - Locked <0x00000007d5a9beb8> (a java.lang.string) في java.lang.thread.run (مصدر غير معروف) "Thread -0" prio = 6 tid = 0x00000000cb0e800 nid = 0x6bc انتظر مراقبة [0x 00000000000000dd48f0000. java.lang.thread.state: محظور (على مراقبة الكائن) في thread.deadlockdemo $ 1.run (deadlockdemo.java:21) - في انتظار قفل <0x00000007d5a9beb8> (a java.lang.string) - locked <0x000007d5a9be88> java.lang.thread.run (مصدر غير معروف)
عدة طرق شائعة لتجنب الجمود.
تجنب الحصول على أقفال متعددة في نفس الوقت مثل الخيط.
تجنب موضوع واحد يحتل موارد متعددة في نفس الوقت في الحبل ، وحاول التأكد من أن كل حبل يستهلك مورد واحد فقط.
حاول استخدام البحث المحدد ، باستخدام Lock.Trylock (مهلة) بدلاً من استخدام آلية البحث الداخلي.
بالنسبة لكابلات قاعدة البيانات ، يجب أن يكون القفل وفتح في اتصال قاعدة البيانات ، وإلا سيفشل فتح.
مرجع:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
لخص
ما سبق هو تحليل الكود الكامل للطرق المشتركة لـ Java لتجنب حالات الجمود في هذه المقالة. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!