السلام عليكم
كيف حال الشباب إن شاء الله بخير
كيف حال الأخ عبده يبدو أنك انقطعت عن عادة أكل الورق المحببة
الحمد لله
تلقيت اليوم رسالة تهديد تتوعدني بالتهام حنجرتي إن أطلت في مقالاتي
لذلك فأنا مضطر أن اختصر فلست أحب منظر الآنسات الاتي سيرون الجئة
(بصراحة لست أحب أن تكون موتتي بهذه البشاعة)
نعود إلى موضوعنا
على أساس أن الموضوع بدأ (هذه من أماني)
نحن نعرف أن جافا تدعم تعدد الخيوط multithreading بالطبع هذا يمثل جموعاً من المشاكل
هناك أحد الأخوة الخيوط يريد أن يستخدم متغيراً
فماذا سيفعل؟؟؟
1-سيأخذ نسخة من المتغير
2-سيعدل عليه
3-سيعيد الناتج إلى المتغير
كلام جيد جداً ولا مشاكل هناك على الإطلاق
ماذا لو كان البرنامج يحتوي على أكثر من خيط
لا مشكلة هناك إلا أن يقرر اثنين من الأخوة الخيوط أن هذا المتغير يجب استخدامه
هنا تحل اللعنة على المبرمج
فالبرنامج كان سليم كالجرس من دقائق
ما الذي جرى الآن
يبدو أني مضطر إلى أن آخذك في رحلة إلى داخل جهاز الحاسوب لنعرف ما الذي حدث
احزموا الأمتعة بسرعة فالوقت ليس في صالحنا
لا أطفال في الموضوع
فلسنا بصدد الذهاب إلى الداية أم عطية
اييييييييييييييييييييييييييب
وصلنا إلى الآلة الافتراضية التي تسكن فوق المساحة 0xf07c في الذاكرة العشوائية RAM
ماهذا الغبار؟
تعالوا لنسأل هذا الخيط هناك
ياحج ياحج ما المشكلة هنا
الخيط خ#1 في قتال مع الخيط خ#2
يبدو أنك جديد هنا
تنحى جانباً وإلا قتلت خطأً
شكراً يا باشا
الآن نسمع الحوار التالي بين خ#1 و خ#2
وسع يا ابن ….
أنا جئت في الأول لماذا لا تذهب إلى الجحيم
أنا هوريك يا ابن …
طويل لسان قليل أفعال
يبدو أن الأخ خ#1 في مزاج غير رائق بالمرة
فلنعد إلى أرض الواقع
فلقد رأينا ما يكفي
فلتربطوا الأحزمة
لا تنسى يا عبده أن تتأكد من تذاكر كل الحضور
فلست أحب أن أجد الأخ خ#1 بيننا على سطح الأرض
تمام يا باشا(هذه من عبده)
على بركة الله
اييييييييييييييييييييب
وصلنا والحمد لله
سأفسر لكم ما رأيناه في رحلتنا
الخيط خ#1 يريد أن يستخدم المتغير س مثلاً
يأخذ نسخة منه ويعدل عليها ثم يعيد القيمة إلى المتغير
هذا يستمر في الحصول حتى يقرر الخيط خ#2 أنه بحاجة إلى المتغير
فيجلب نسخة منه ويعدل عليها ويضعها في المتغير
بالطبع الآلة الافتراضية لا تسمح للخيط بالبقاء إلى الأبد في المعالج
ماذا لو حصل الترتيب التالي
خ#1 أريد نسخة من المتغير س
الآلة الافتراضية تفضل
الآلة الافتراضية انتهى وقت خ#1 الآن يدخل خ#2
خ#2 أريد نسخة من المتغير س
الآلة الافتراضية تفضل
خ#2 غير قيمة س إلى 7
الآلة الافتراضية تم
الآلة الافتراضية انتهى وقت خ#2 الآن يدخل خ#1
خ#1 غير قيمة س إلى 10
وهكذا المشكلة أن كل واحد لا يعلم إذا كان هناك آخر يعدل على المتغير
فتحدث مشاكل منطقية
حل المشكلة ببساطة استخدم الأخ volatile عندما تعرف المتغير
عندها يصبح الحوار السابق كالتالي
خ#1 أريد نسخة من المتغير س
الآلة الافتراضية تفضل
الآلة الافتراضية انتهى وقت خ#1 الآن يدخل خ#2
خ#2 أريد نسخة من المتغير س
الآلة الافتراضية تعال يوم تاني يا حبي
وتقوم بالحجر على الأخ خ#2 حتى ينتهي الأخ خ#1 من استخدام س
حينها تحرره وتعطيه نسخة من س
ملاحظة:
لن يكون هذا الحل مجد إلا لجملة وحيدة وهي
س=س+5
س=7
س=a.getValue()
في حالة أن أردت المحافظة على قيمة س لأكثر من جملة يرجى مراجعة موضوعي الذي يتحدث عن semaphorse
أنهيت موضوعي أنا
أظن أني لم أستطرد كثيراً لذلك أرى أنه من الظلم التهام حنجرتي
أراكم في لمحة أخرى
تحياتي
شهيد الأقصى
المراجع:1-مقال بعنوان Using the volatile keyword in Java
http://cephas.net/blog/2003/02/17/using-the-volatile-keyword-in-java/
[…] وقضايا التزامن لمن أراد أن يطلع عليها ويستفيد منها 1- لمحة جافاوية 8 ضد الاعتداء 2- لمحة جافاوية 9: كيف توقف خيوطك بأمان 3- لمحة جافاوية 12: […]