في بعض الأحيان ، سيؤدي تحسين المترجمين والمعالجات إلى أن يكون وقت التشغيل مختلفًا عما تخيلناه. لهذا السبب ، فرضت Java بعض القيود على المترجمين والمعالجات. يقوم طراز ذاكرة Java (JMM) بإجراءات هذه خارج بحيث لا توجد حاجة للنظر في الكثير من التفاصيل الأساسية عند كتابة التعليمات البرمجية ، ويضمن أنه "طالما تتبع قواعد JMM لكتابة برنامج ، يجب أن تكون نتيجة التشغيل صحيحة."
بنية مجردة لـ JMM
في Java ، يتم تخزين جميع الحالات والمتغيرات الثابتة في ذاكرة الكومة ، والتي يمكن مشاركتها بين مؤشرات الترابط ، ويسمى هذا الجزء أيضًا المتغيرات المشتركة . المتغيرات المحلية ، ومعلمات تعريف الطريقة ، ومعلمات معالجة الاستثناءات على المكدس ، ولا تتم مشاركة ذاكرة المكدس بين مؤشرات الترابط.
ومع ذلك ، نظرًا لتحسين التحويل البرمجي والمعالج ، ستكون هناك مشاكل في الرؤية مع المتغيرات المشتركة. على سبيل المثال ، في العمليات المتعددة ، يمكن تنفيذ مؤشرات الترابط على معالجات مختلفة ، وسيؤدي ذاكرة التخزين المؤقت غير المتسقة بين المعالجات إلى حدوث مشاكل في الرؤية مع المتغيرات المشتركة . من الممكن أن يرى خيطان قيمًا مختلفة من نفس المتغير.
jmm تجريد التحسينات التي أجراها هذه الأجهزة في أن كل مؤشر ترابط لديه ذاكرة محلية. عندما تحتاج إلى قراءة وكتابة المتغيرات المشتركة ، قم بنسخ نسخة من الذاكرة الرئيسية إلى الذاكرة المحلية. عند كتابة المتغيرات المشتركة ، اكتبها إلى الذاكرة المحلية أولاً ، ثم قم بتحديثها إلى الذاكرة الرئيسية في وقت ما في المستقبل. عندما تتم قراءة المتغير المشترك مرة أخرى ، سيتم قراءته فقط من الذاكرة المحلية.
وبهذه الطريقة ، يتطلب التواصل بين المواضيع خطوتين:
اكتب مؤشر ترابط: قم بتحديث الذاكرة المحلية وقراءة الموضوع: اقرأ القيمة المحدثة من الذاكرة الرئيسية
وبهذه الطريقة ، هناك تأخير بين الكتابة والقراءة: متى سيتم تحديث الذاكرة المحلية للذاكرة الرئيسية؟ هذا يؤدي إلى مشاكل الرؤية ، وقد ترى مؤشرات الترابط المختلفة متغيرات مشتركة مختلفة.
يحدث قبل
يحدث حرفيًا قبل أن "قبل الحدوث قبل هذا". هذه هي القاعدة التي تضعها Java على ترتيب تنفيذ البرنامج ، ويجب اتباع التزامن. وبهذه الطريقة ، يحتاج المبرمجون فقط إلى كتابة البرنامج المتزامن الصحيح ، ويحقق ذلك عدم وجود نتائج تشغيل غير خاطئة.
لا يعني A-be-be-be-be be-b late فقط أن A يتم تنفيذه قبل B ، ولكن يعني أيضًا أن نتيجة تنفيذ A مرئية لـ B ، مما يضمن الرؤية.
لا يجب تنفيذ A-be-be-be-be ، لا يجب تنفيذها قبل B. إذا كانت AB تتناوب ونتائج التنفيذ لا تزال صحيحة ، يُسمح للمترجم والمعالج بتحسين إعادة الترتيب. طالما أن نتائج البرنامج صحيحة ، فلا توجد مشكلة في كيفية تحسين المترجم والمعالج وإعادة ترتيبه ، وكل ذلك جيد.
يحدث قبل القواعد
قواعد تسلسل البرنامج: في مؤشر ترابط ، قواعد قفل التشغيل بعد العملية السابقة يحدث: بالنسبة لنفس القفل ، إلغاء قفل الحدث قبل قفل قواعد المجال المتطايرة: اكتب المتغير المتطاير ، وقراءة أي من المتغيرات المتقلبة بعد حدوثها. عابرة العملية: A-peore-be-pe-be ، b-be-be-be-be-be-be-be-be-be-be-be-be-s start () قواعد () القواعد: إذا كان مؤشر الترابط A ينفذ threadb.start () ثم threadb.start () profore-be-
المثال التالي يساعد على فهم SEMPLE-
مزدوج PI = 3.14 ؛ // adouble r = 1.0 ؛ // bdouble area = pi * r * r ؛ // ج
فيما يلي ثلاثة علاقات من قبل ، والقاعدة 1 و 2 هي قواعد أمر البرنامج ، والقواعد 3 مستمدة من القواعد المتعدية:
حدث قبل BB يحدث قبل Ca يحدث قبل ج
C يعتمد على A و B ، ولكن لا A ولا B يعتمد عليه. لذلك حتى إذا تم إعادة ترتيب A و B ، فلن تتغير نتائج التنفيذ. في هذا إعادة الترتيب ، JMM قيد التشغيل.
تسلسل التنفيذ التاليان صحيحان.
ما ورد أعلاه هو كل المحتوى الذي جمعناه لك حول تعلم طراز MEMMY JMM JMM. لمزيد من الأسئلة ، يرجى ترك رسالة أدناه للمناقشة. شكرا لدعمكم ل wulin.com.