قد يكون العديد من الأصدقاء قد سمعوا عن الكلمة الرئيسية المتطايرة وربما استخدموها. قبل Java 5 ، كانت كلمة رئيسية مثيرة للجدل ، حيث أن استخدامها في البرامج غالبًا ما أدى إلى نتائج غير متوقعة. فقط بعد أن استعادت Java 5 الكلمة الرئيسية المتطايرة حيويتها.
تتمثل وظيفة الكلمة الرئيسية المتطايرة في جعل جميع مؤشرات الترابط في النظام مرئيًا للمتغيرات المعدلة بواسطة الكلمة الرئيسية ، ويمكن أن تحظر ذاكرة العمل الخاصة بالمعلومات من المتغيرات المخزنة المعدلة بواسطة المتقلبة.
سيناريوهات الاستخدام 2 المتقلبة:
1. الرؤية: توفر Java كلمات رئيسية متقلبة لضمان الرؤية.
عندما يتم تعديل متغير مشترك بواسطة متقلبة ، فإنه يضمن تحديث القيمة المعدلة إلى الذاكرة الرئيسية على الفور ، وعندما تحتاج مؤشرات الترابط الأخرى إلى قراءتها ، ستقرأ القيمة الجديدة في الذاكرة.
ومع ذلك ، لا يمكن للمتغيرات المشتركة العادية ضمان الرؤية ، لأنه غير مؤكد عندما يتم كتابة المتغير المشترك العادي إلى الذاكرة الرئيسية بعد تعديله. عندما تقرأها مؤشرات الترابط الأخرى ، قد لا تزال القيمة القديمة الأصلية في الذاكرة ، لذلك لا يمكن ضمان الرؤية.
بالإضافة إلى ذلك ، يمكن أن يضمن المزامنة والقفل أيضًا الرؤية. يمكن أن يضمن المزامنة والقفل أن مؤشر ترابط واحد فقط يكتسب القفل في نفس الوقت ويقوم بتنفيذ رمز التزامن. قبل إطلاق القفل ، سيتم تحديث تعديل المتغير إلى الذاكرة الرئيسية. لذلك ، يمكن ضمان الرؤية.
دعونا نلقي نظرة على قطعة من الكود أولاً. إذا تم تنفيذ الموضوع 1 أولاً وتم تنفيذ الموضوع 2 لاحقًا:
// thread 1Boolean stop = false ؛ بينما (! توقف) {dosomething () ؛} // thread 2stop = true ؛هذا الرمز هو جزء نموذجي للغاية من الكود ، وقد يستخدم العديد من الأشخاص طريقة الترميز هذه عند مقاطعة الخيوط. ولكن في الواقع ، هل سيعمل هذا الرمز بشكل صحيح تمامًا؟ هل ستتم مقاطعة الموضوع؟ ليس بالضرورة. ولعل في معظم الوقت ، يمكن لهذا الرمز مقاطعة مؤشرات الترابط ، ولكنه قد يتسبب أيضًا في عدم توقف مؤشر الترابط (على الرغم من أن هذا الاحتمال صغير جدًا ، بمجرد حدوث ذلك ، فإنه سيؤدي إلى حلقة ميتة).
دعونا نوضح سبب فشل هذا الرمز في انقطاع مؤشر الترابط. كما هو موضح سابقًا ، يحتوي كل مؤشر ترابط على ذاكرة العمل الخاصة به أثناء التشغيل ، لذلك عند تشغيل الموضوع 1 ، فإنه سينسخ قيمة متغير STOP ويضعه في ذاكرته العاملة.
ثم عندما يغير الموضوع 2 قيمة متغير STOP ، ولكن لم يكن لديه وقت لكتابتها إلى الذاكرة الرئيسية ، فإن الموضوع 2 يذهب للقيام بأشياء أخرى ، ثم لا يعرف الموضوع 1 عن تغييرات الموضوع 2 إلى متغير الإيقاف ، لذلك سيستمر في الحلقة.
ولكن بعد التعديل مع متقلبة يصبح الأمر مختلفًا:
أولاً: سيؤدي استخدام الكلمة الرئيسية المتطايرة إلى إجبار القيمة المعدلة التي سيتم كتابتها إلى الذاكرة الرئيسية على الفور ؛
ثانياً: إذا كنت تستخدم الكلمة الرئيسية المتطايرة ، عندما يقوم مؤشر الترابط 2 بتعديلها ، فسيكون خط ذاكرة التخزين المؤقت لمتغير ذاكرة التخزين المؤقت في ذاكرة العمل 1 غير صالح (إذا كان ينعكس في طبقة الأجهزة ، فإن خط ذاكرة التخزين المؤقت المقابلة في ذاكرة التخزين المؤقت L1 أو L2 من وحدة المعالجة المركزية غير صالحة) ؛
ثالثًا: نظرًا لأن خط ذاكرة التخزين المؤقت الخاصة بمتغير ذاكرة التخزين المؤقت في ذاكرة العمل في مؤشر الترابط 1 غير صالح ، فإن مؤشر الترابط 1 سيقرأه في الذاكرة الرئيسية عندما يقرأ قيمة التوقف المتغير مرة أخرى.
ثم عندما يقوم مؤشر الترابط 2 بتعديل قيمة الإيقاف (بالطبع ، هناك عمليتان هنا ، وتعديل القيمة في ذاكرة العمل في مؤشر الترابط 2 ، ثم كتابة القيمة المعدلة للذاكرة) ، سيكون خط ذاكرة التخزين المؤقت لوقف ذاكرة التخزين المؤقت في ذاكرة العمل 1 غير صالح. عندما يقرأ الموضوع 1 ، يجد أن خط ذاكرة التخزين المؤقت غير صالح. سوف ينتظر تحديث عنوان الذاكرة الرئيسي المقابل لخط ذاكرة التخزين المؤقت ، ثم قراءة أحدث قيمة في الذاكرة الرئيسية المقابلة.
ثم ما يقرأ مؤشر الترابط 1 هو أحدث قيمة صحيحة.
2. ضمان النظام
بدأ Boolean المتقلوب = false ؛ // الموضوع 1: context = loadContext () ؛ بدأ = صحيح ؛ // thread 2: بينما (! inited) {sleep ()} dosomething withConfig (context) ؛تأكد من تهيئة السياق.
3. فحص دبل
Class Singleton {private private folatile static static singleton extreal = null ؛ private singleton () {} public static singleton getInstance () {if (مثيل == nULL) {synchronized (exingleton.class) {if (مثيل == null)ما سبق هو شرح مفصل لدور واستخدام الكلمة الرئيسية المتطايرة في جافا التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!