في برامج Java ، قد يكون من الضروري في بعض الأحيان تأجيل بعض عمليات تهيئة الكائنات عالية الرأس ويتم تهيئتها فقط عند استخدام هذه الكائنات. وهذا ما يسمى التهيئة المتأخرة أو التحميل كسول
انظر إلى تهيئة تأخير غير آمنة:
بعد أن ينفذ مؤشر الترابط A 1 ، يجد أن مثيل الكائن فارغ وأنه جاهز للتطبيق الجديد ، في حين أن الموضوع B جديد أولاً ، مما يسبب خطأً.
يمكننا استخدام أقفال التزامن لضمان صحة:
لكن مزامنة الطريقة بأكملها مكلفة للغاية ، وتوصل الناس إلى قفل فحص مزدوج:
يبدو أن قفل التزامن المستخدم في الحد الأدنى للنطاق يحقق الغرض باستخدام التدقيق المزدوج ، ولكن هذا له مشكلة: عندما ينفذ مؤشر الترابط 4 ، لم يتم تنفيذ مؤشر الترابط B 7 بعد ، وخيط A يحدد مثيل! = فارغ. لم يتم تنفيذ الموضوع 7 من الموضوع B ، فلماذا يحدث هذا؟
ألقِ نظرة على التنفيذ الرئيسي الأساسي لمثيل جديد ():
في الواقع ، هو أولاً تنفيذ 1 تخصيص ذاكرة ، ثم تهيئة الكائن وتعيين المثيل. ثم هناك إعادة ترتيب هنا ، ويمكن استبدال ترتيب 2 و 3:
لذلك عندما لا يزال B ينفذ 7 ، يحدد A في 4 أنه تم تهيئة كائن المثيل. إذا تم استدعاء المثيل قبل ctorinstance (الذاكرة) سيؤدي إلى حدوث خطأ.
هناك حلان:
1. إعلان كائن المثيل على أنه متقلب ، سيحظر إعادة ترتيب 2 و 3
2. باستخدام حل يعتمد على تهيئة الفئة: سيقوم JVM بإجراء تهيئة فئة في مرحلة التهيئة للفئة (أي بعد تحميل الفصل وقبل استخدامه بواسطة مؤشر الترابط). يخرج
أثناء تهيئة فئة التنفيذ ، ستحصل JVM على قفل. يمكن لهذا القفل مزامنة تهيئة نفس الفئة بواسطة مؤشرات ترابط متعددة
سنجد أن رمز التنفيذ للمخطط القائم على تهيئة الفصل أكثر بساطة. لكن مخطط قفل الفحص المزدوج القائم على التقلب له ميزة إضافية: بالإضافة إلى تأخير تهيئة الحقول الثابتة ، يمكنه أيضًا تأخير تهيئة حقول المثيل. يقلل تهيئة تأخير الحقل من النفقات العامة لتهيئة الفئات أو إنشاء مثيلات ، ولكنه يزيد من النفقات العامة للوصول إلى الحقول التي يتم تأخيرها. معظم الوقت ، التهيئة العادية أفضل من تأخر التهيئة. إذا كنت بحاجة حقًا إلى استخدام التهيئة الآمنة المتأخرة لمؤشر الترابط ، فالرجاء استخدام مخطط تهيئة التأخير المستند إلى التأخير الموضح أعلاه ؛ إذا كنت بحاجة حقًا إلى استخدام التهيئة الآمنة المتأخرة للحقول الثابتة ، فيرجى استخدام مخطط التهيئة المستند إلى الفصل الموضح أعلاه.
لخص
ما سبق هو رمز تنفيذ قفل Java Double Check الذي قدمه المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!