لمحة جافاوية 23: مشاكل الخيوط في جافا

السلام عليكم

الخيوط في جافا تعتبر العصب الرئيس
بل إنها من أهم المزايا في هذه اللغة
والجافا على بطئها فإن الخيوط فيها
إذا استخدمت بشكل صحيح تجعلها مقبولة
لكن في بعض الأحيان تصبح الخيوط
لعنة…!!
وتضيع الكثير من الموارد إذا أسيء استخدامها
(وأعني بالموارد الذاكرة والوقت والمعالج)
اليوم سنتعرض لبعض المشاكل التي يجب على مبرمج جافا
أن يأخذ حذره منها عند التعامل مع الخيوط

1-التوقف إلى الأبد deadlock
التوقف إلى الأبد يحصل في كل ناحية من نواحي الحياة
ومثال توقف تقاطعات السيارات شاخص أمامنا
بالنسبة للخيوط الأمر مماثل
لو فرضنا أن لدينا خيط أ ينتج شيء ما ويستهلك شيء آخر
وخيط ب يستهلك ما ينتجه الخيط أ وينتج ما يستهلكه أ
الآن تخيل السناريو التالي
أ يريد أن يستهلك ما ينتج ب و ب لم ينتج
فيتوقف أ عن العمل في انتظار إنتاج ب
يأتي ب يريد أن يستهلك ما ينتج أ و أ لم ينتج
فيتوقف ب عن العمل في انتظار إنتاج أ
ويظل الخيطين متوقفين إلى الأبد

2-الانتظار الطويل(الجوع للعمل) Starvation
وهذه المشكلة تكمن في أن الخيط
يبقى فترة طويلة متوقف لا يستطيع أن يعمل
لكن لا يوجد إنسداد
مثال على ذلك
الدوال المتزامنة synchronized
لو كان عندنا دالة من هذه الدوال
تأخذ فترة طويلة في العمل
فإن الخيط الداخل إليها ستطول فترة فعاليته Active كثيراً
وذلك لأن هذه الدوال
تعمل بطريقة الحدث الموحد Atomic Action
(الحدث الموحد يعني أنها إما أن تنفذ كلها أو تترك كلها
فلا يتم التقطيع في عملها أبداً)
تخيل التالي مجموعة من الخيوط تطلب دالة من هذا النوع
يقوم الخيط الأول بطلبها فيدخل ويعمل فيها
ثم تأتي الخيوط الأخرى تباعاً
كل ما يأتي خيط جديد يتم إيقافه عن العمل
بينما الخيط الأول لا يزال يعمل
نلاحظ أن الخيط الأخير الذي طلب الدالة
انتظر مدة مقدارها = مدة طويلة * عدد الخيوط التي كانت موجودة عندما طلب
هنا أحب أن أأكد أن الجافا لا تعاني من هذه المشكلة
بسبب تفضيل priority خيط على خيط
وإنما بسبب طول فترة العمل على الدوال synchronized

3-العمل إلى الأبد Livelock
هذه المشكلة تكمن في أن الخيوط لا تتفاهم مع بعضها
الخيط الأول يقوم بحدث معين
ويفترض من الخيط الثاني أن يقوم بحدث ما
فيقوم الخيط الثاني بحدث معاكس للحدث المتوقع
فيقوم الخيط الأول بنفس الحدث الأول
يظهر لنا أن المبرمج أخطأ في ترتيب الأحداث بشكل صحيح
مثال شخصين التقوا في طريق متقابلين
فقام أحدهم بأخذ اليمين ليسمح للآخر بالعبور
لكن الآخر أخذ يساره بدلاً من أن يعبر
وهكذا
ملاحظة:
في هذه المشكلة لا تتوقف الخيوط عن العمل
وإنما تستمر في العمل

حل هذه المشاكل
تركيز المبرمج لا أكثر ولا أقل

الدروس المستفادة
إما أن تكون تعرف ما تفعل
وإلا فلا تستخدم الخيوط أبداً
أو استعين بخبير في جافا مثلي :)

المراجع:
1-java tutorials: Liveness

http://java.sun.com/docs/books/tutorial/essential/concurrency/liveness.html

تحياتي

Tags: , , , , , , , , , , , ,

Leave a Reply