English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ملاحظات على دراسة نموذج ذاكرة Java JMM

في بعض الأحيان، قد يؤدي تحسين معالج الكود ومعالج الشيفرة إلى أن يكون runtime مختلفًا عن التوقعات، لذلك قامت Java بفرض بعض القيود على معالج الكود ومعالج الشيفرة، ويقوم نموذج ذاكرة Java (JMM) بإخراج هذه الأمور، وبالتالي لا يتطلب كتابة الكود التفكير في كثير من التفاصيل الأساسية، ويضمن ‘أن يكون الناتج النهائي صحيحًا طالما يتم اتباع قواعد JMM عند كتابة البرنامج’.

هيكلية JMM

في Java، يتم تخزين جميع الاستنساخات والمعلمات الثابتة في ذاكرة الحجم، ويمكن مشاركة ذاكرة الحجم بين الخيوط، هذا الجزء يُدعىالمتغيرات المشتركة، بينما المتغيرات المحلية، معلمات التعريف بالطريقة، ومعلمات معالجة الاستثناءات موجودة في السلسلة، لا يتم مشاركة ذاكرة السلسلة بين الخيوط.

وبسبب تحسينات المبرمج والمحول، قد يظهر مشكلة الوضوح في المتغيرات المشتركة، مثل في المعالجات المتعددة النواة (multi-processor)، يمكن تنفيذ thread في معالج مختلف، والـعدم التوافق بين الحافظات في المعالجات يؤدي إلى ظهور مشكلة الوضوح في المتغيرات المشتركة، من الممكن أن يرى تسلسلان نفس القيمة المختلفة للـ variable.

يُقوم JMM بتفصيل هذه التحسينات الجهازية كأن كل thread لديه ذاكرة محلية. عند الحاجة إلى كتابة أو قراءة مجال مشترك، يتم نسخ نسخة من الذاكرة الرئيسية إلى الذاكرة المحلية. عند كتابة مجال مشترك، يتم كتابة إلى الذاكرة المحلية أولاً، ثم في وقت لاحق يتم تحديث الذاكرة المحلية إلى الذاكرة الرئيسية. عند قراءة مجال مشترك مرة أخرى، يتم قراءة من الذاكرة المحلية فقط.

بهذا، يتطلب التواصل بين التسلسلات خطوتين:

الـ thread الكاتبة: تحديث الذاكرة المحلية إلى الذاكرة الرئيسية الـ thread القارئة: قراءة القيمة المحدثة من الذاكرة الرئيسية

بهذا، هناك تأخير بين الكتابة والقراءة: متى يتم تحديث الذاكرة المحلية إلى الذاكرة الرئيسية؟ مما يؤدي إلى مشكلة الوضوح، قد يرى مختلف التسلسلات المتغيرات المشتركة بشكل مختلف.

happens-before

من الناحية اللفظية، معنى الـ happens-before هو "يحدث قبل". هذه هي قواعد تنفيذ البرنامج التي وضعها جافا، ويجب اتباع هذه القواعد لتحقيق التوافق. بهذا، يمكن للمبرمج كتابة برنامج توافقي صحيح، وضمان أن لا يحدث خطأ في نتائج التنفيذ.

A يحدث قبل B، لا يعني فقط أن A يُنفذ قبل B، بل يعني أيضًا أن نتائج A تُظهر لـ B، مما يضمن الوضوح.

A يحدث قبل B، لا يعني بالضرورة أن A يجب أن يُنفذ قبل B، إذا كان AB يتبادلان، فإن نتائج التنفيذ قد تكون صحيحة، مما يسمح للمبرمج والمحول بتوليد ترتيب وتنظيم. لذا، طالما أن نتائج البرنامج صحيحة، فإن كيفية تحسين المبرمج والمحول وكيفية تنظيم الترتيب ليست مشكلة، وكلها جيدة.

قواعد الـ happens-before

قواعد التسلسل البرمجية: في نطاق نفس التسلسل، العمل السابق يحدث قبل العمل التالي قواعد الـ lock: لـ lock نفس، فتح الـ lock يحدث قبل إغلاق الـ lock قواعد مجال الـ volatile: الكتابة على مجال الـ volatile، يحدث قبل أي عمل قراءة هذا مجال الـ volatile قابلية التمرير: إذا كان A يحدث قبل B، و B يحدث قبل C، فإن A يحدث قبل C قواعد الـ start(): إذا قام التسلسل A بتنفيذ ThreadB.start()، فإن ThreadB.start() يحدث قبل أي عمل في التسلسل B قواعد الـ join(): إذا قام التسلسل A بتنفيذ ThreadB.join()، فإن جميع الأعمال في التسلسل B يحدث قبل join() التسلسل B

هذا المثال يمكن أن يساعد في فهم happens-before

double pi = 3.14; //A
double r = 1.0; //B
double area = pi * r * r; //C

هناك ثلاثة علاقات happens-before، القاعدة 1 و 2 هي قواعد التسلسل البرمجي، والقاعدة 3 هي استنتاج من قاعدة التوليد:

A happens-before B B happens-before C A happens-before C

C يعتمد على A و B، ولكن A و B لا يعتمدان على أي منهما. لذلك، حتى إذا تم إعادة ترتيب A و B، فإن النتيجة لن تتغير، وإعادة الترتيب هذه، هي كيفية تشغيل JMM.

نتائج تنفيذ النوعين أدناه صحيحة.

هذا هو محتوى دروسنا الكامل حول تعلم نموذج ذاكرة Java JMM، يمكن للجميع طرح الأسئلة في الأسفل للمناقشة، شكرًا لدعمك لتعليمات الصراخ.

البيان: محتوى هذا المقال تم جمعه من الإنترنت، يملكه صاحب الحقوق، يتم إضافة المحتوى من قبل مستخدمي الإنترنت بتحميلهم بشكل مستقل، ويتم إدارة هذا الموقع دون امتلاك حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية. إذا وجدت محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) للإبلاغ، وتقديم الدليل، وإذا تم التحقق من صحة الشكوى، سيتم حذف المحتوى المزعوم فورًا.

مفضل لك