تلعب الكلمة المفتاحية المتطايرة دورًا مهمًا نسبيًا في Java Multi-Thrheading. تتمثل الوظيفة الرئيسية للمتقلبة في الحفاظ على متغيرات مرئية في متعدد الخيوط وهي أخف آلية التزامن المقدمة في Java.
الرؤية
جميع المتغيرات في نموذج ذاكرة Java (المتغيرات هنا هي المتغيرات العالمية ، وليس المتغيرات المحلية. لا توجد مشكلة آمنة في مؤشر ترابط في الطريقة ، لأن المتغيرات يتم تدميرها كما تسمى الطريقة) في الذاكرة الرئيسية. كل موضوع لديه ذاكرة العمل الخاصة به. في كل مرة يتم تنفيذ مؤشر الترابط ، سيتم الحصول على نسخة من المتغير من الذاكرة الرئيسية ، وسيتم تنفيذ تشغيل المتغير في ذاكرة العمل في مؤشر الترابط. لا يمكن لخيوط مختلفة مشاركة الذاكرة العاملة ، ويمكنها فقط قراءة نسخة المتغير من الذاكرة الرئيسية. على وجه التحديد ، يمكن التعبير عنه في الشكل أدناه:
ومع ذلك ، بالنسبة للتقلب (باستخدام التعديلات المتزامنة/النهائية ، يتم كسر القاعدة أعلاه ، أي عندما يعدل الخيط قيمة المتغير ، يمكن أن تعرف مؤشرات الترابط الأخرى على الفور تغيير المتغير. يمكن استنتاج أنه طالما يتم استخدام متغير عن طريق المتقلبة ، فإن المتغير آمن للعمل في بيئة متعددة الخيوط ، لأنه مرئي للذاكرة العاملة لجميع المواضيع ، وهذا هو ما يدعو إلى ما يدعو إلى ما يلي.
اختبار الطبقة العامة {private static folatile t = 0 ؛ private static int add () {return t ++ ؛ ) thread.start () ؛ } بينما (thread.activecount ()> 1) {thread.yield () ؛ } system.out.println (t) ؛ } public static void main (string [] args) {testVolatile () ؛ }}من المتوقع أن تكون قيمة T 20،000 ، ولكن سيكون هناك موقف حيث تكون قيمة T أقل من 20،000. يجب أن تخمن السبب. تكمن المشكلة في T ++. T ++ ليست عملية ذرية. في Java ، تعني عملية T ++ أولاً الحصول على قيمة T ، ثم إضافة 1 ، ثم تعيين T. عند الحصول على قيمة t ، يتم تعديلها بواسطة متقلبة ، بحيث يمكن الحصول على أحدث قيمة للمعلومات. ومع ذلك ، عند إضافة 1 ، لا يمكن ضمانه. من الممكن أن تكون المواضيع الأخرى قد أضفت بالفعل 1.
إذن ما هو سيناريو الأنسب لاستخدام متقلبة؟
* في التشغيل المتغير لا يعتمد على القيمة الحالية
* لا تحتاج المتغيرات إلى المشاركة في قيود ثابتة مع متغيرات الدولة الأخرى
تُرجم إلى الصينية تعني أنه بالنسبة للمتغيرات التي قرأت وتكتب في الخيوط المتعددة ، يمكنك استخدام متقلبة لتعديلها. وبهذه الطريقة ، يجب ألا تستخدم عمليات القفل/المتزامنة لعمليات القراءة. القراءة مباشرة لأن المتغيرات مرئية.