في معالجة تزامن خيط Java ، هناك الكثير من الالتباس في استخدام كلمة رئيسية متقلبة. أعتقد أن استخدام هذه الكلمة الرئيسية يمكن أن يجعل كل شيء يسير على ما يرام عند استخدام معالجة التزامن متعدد الخيوط.
تدعم لغة جافا متعددة الخيوط. من أجل حل مشكلة تزامن الخيط ، يتم تقديم الكتلة المتزامنة وآلية الكلمات الرئيسية المتطايرة داخل اللغة.
متزامن
الجميع على دراية بالكتل المتزامنة ، ويتم تنفيذها من خلال الكلمة الرئيسية المتزامنة. مع عبارات متزامنة وكتلة ، يمكن لخيط واحد فقط استخدامها في نفس الوقت عند الوصول إلى قوائم متعددة.
طريقة تعديل متزامنة أو كتلة رمز.
متقلب
بالنسبة للمتغيرات التي تم تعديلها باستخدام متطاير ، سيقرأ مؤشر الترابط القيمة الأكثر تعديلًا للمتغير في كل مرة يستخدم فيها المتغير. يتم إساءة استخدام التقلب بسهولة واستخدامها للعمليات الذرية.
دعونا نرى مثالا أدناه. نحن ننفذ عداد. في كل مرة يبدأ فيها مؤشر الترابط ، سيتم استدعاء طريقة Counter Inc لإضافة واحدة إلى العداد.
بيئة التنفيذ - إصدار JDK: JDK1.6.0_31 ، الذاكرة: 3G CPU: x86 2.4g
عداد الفئة العامة {public static int count = 0 ؛ public static void inc () {// التأخير هنا هو 1 مللي ثانية واحدة ، مما يجعل النتيجة واضحة المحاولة {thread.sleep (1) ؛} catch (interruptedexception e) {} count ++ ؛} 0 ؛النتيجة الجري: counter.count = 995
قد تكون نتيجة العملية الفعلية مختلفة في كل مرة. نتيجة الجهاز هي: النتيجة تشغيل: counter.count = 995. يمكن أن نرى أنه في بيئة متعددة الخيوط ، لا يتوقع Count أن تكون النتيجة 1000.
يعتقد الكثير من الناس أن هذه مشكلة تزامن متعددة الخيوط. تحتاج فقط إلى إضافة متقلبة قبل عدد المتغير لتجنب هذه المشكلة. ثم نقوم بتعديل الكود لمعرفة ما إذا كانت النتيجة تلبي توقعاتنا.
عداد الفئة العامة {العدد الثابت العام المتقلب العام = 0 ؛ public static void inc () {// التأخير هنا هو 1 مللي ثانية ، مما يجعل النتيجة واضحة المحاولة {thread.sleep (1) ؛ i = 0 ؛ i <1000 ؛نتيجة التشغيل: counter.count = 992
لا تزال نتيجة العملية ليست 1000 كما توقعنا. دعونا نحلل الأسباب أدناه
في مقالة مجموعة Java Garbage ، تم وصف تخصيص الذاكرة في لحظة JVM. واحدة من مناطق الذاكرة هي مكدس الجهاز الظاهري JVM ، وكل مؤشر ترابط يحتوي على مكدس مؤشر ترابط عند تشغيله.
يحفظ مكدس مؤشر الترابط معلومات القيمة المتغيرة أثناء وقت تشغيل مؤشرات الترابط. عندما يصل مؤشر ترابط إلى قيمة كائن معين ، ابحث أولاً عن قيمة المتغير المقابل لذاكرة الكومة من خلال مرجع الكائن ، ثم ضع ذاكرة الكومة
يتم تحميل القيمة المحددة للمتغير في الذاكرة المحلية للمعلومات ويتم إنشاء نسخة من المتغير. بعد ذلك ، لم يعد مؤشر الترابط أي علاقة مع القيمة المتغيرة للكائن في ذاكرة الكومة ، ولكنه يعدل مباشرة قيمة متغير النسخ.
في لحظة معينة بعد التعديل (قبل خروج مؤشر الترابط) ، تتم كتابة قيمة نسخة متغير مؤشر الترابط تلقائيًا إلى متغير الكائن في الكومة. بهذه الطريقة ستتغير قيمة الكائن في الكومة. الصورة التالية
اقرأ وتحميل متغيرات النسخ من الذاكرة الرئيسية إلى الذاكرة العاملة الحالية
استخدم وتعيين رمز لتغيير القيمة المتغيرة المشتركة
تخزين وكتابة تحديث المحتوى الرئيسي ذي الذاكرة مع بيانات الذاكرة العاملة
حيث يمكن أن يظهر الاستخدام والتعيين عدة مرات
ومع ذلك ، فإن هذه العمليات ليست ذرية ، أي بعد تحميل القراءة ، إذا تم تعديل متغير عدد الذاكرة الرئيسي ، فلن تسبب القيمة في ذاكرة العمل في مؤشر الترابط تغييرات مقابلة لأنه تم تحميله ، لذلك ستكون النتيجة المحسوبة مختلفة عن المتوقع.
بالنسبة للمتغيرات التي تم تعديلها بواسطة متقلبة ، يضمن جهاز JVM الظاهري فقط أن القيمة المحملة من الذاكرة الرئيسية إلى ذاكرة العمل هي الأحدث
على سبيل المثال ، إذا كان مؤشر الترابط 1 و Prohet 2 يقومان بإجراء عمليات القراءة والتحميل ، وابحث عن أن قيمة العد في الذاكرة الرئيسية هي 5 ، فسيتم تحميل أحدث قيمة
بعد تعديل عدد الكومة في الموضوع 1 ، سيتم كتابته في الذاكرة الرئيسية ، وسيصبح متغير العد في الذاكرة الرئيسية 6.
نظرًا لأن Thread 2 قام بالفعل بإجراء عملية القراءة والتحميل ، سيتم أيضًا تحديث القيمة المتغيرة لعدد الذاكرة الرئيسي إلى 6 بعد العملية.
يؤدي هذا إلى حدوث التزامن بعد تعديل خيطين مع الكلمة الرئيسية المتطايرة في الوقت المناسب.
ما سبق هو معنى الكلمة الرئيسية المتطايرة في جافا التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!