مقدمة
تحاول هذه المقالة استكشاف المراجع الضعيفة في جافا من وجهات نظر ما ولماذا وكيفية مساعدة الجميع على فهم التعريفات وسيناريوهات الاستخدام الأساسية وأساليب الاستخدام للمراجع الضعيفة في جافا.
1. ماذا-ما هو اقتباس ضعيف؟
تشير المراجع الضعيفة في Java على وجه التحديد إلى java.lang.ref.WeakReference<T> فئة. دعونا أولاً نلقي نظرة على الوثائق الرسمية يشرح ذلك:
لا يمنع وجود كائن مرجعي ضعيف الكائن الذي يشير إليه من إعادة تدويره بواسطة جامع القمامة. الاستخدام الأكثر شيوعًا للمراجع الضعيفة هو تنفيذ التعيينات الكنسية (مثل جداول التجزئة).
على افتراض أن جامع القمامة يقرر أن الكائن يمكن الوصول إليه بشكل ضعيف في وقت معين من الوقت (أي أن جميع النقاط الحالية إليها هي مراجع ضعيفة) ، فإن جامع القمامة سوف يمسح جميع المراجع الضعيفة إلى الكائن ، ثم وضع علامة على الكائن الضعيف القابل للوصول إلى النهائي ، بحيث يتم إعادة تدويره لاحقًا. في نفس الوقت أو لاحقًا ، سيضع جامع القمامة المراجع الضعيفة التي تم مسحها حديثًا في قائمة الانتظار المرجعية المحددة عند إنشاء كائن مرجعي ضعيف.
في الواقع ، هناك أربعة أنواع من المراجع في Java ، والتي هي من قوية إلى ضعيفة: مرجع قوي ، مرجع ناعم ، مرجع ضعيف ، والمرجع الافتراضي .
أدناه نقدم بإيجاز ثلاثة اقتباسات أخرى إلى جانب الاستشهادات الضعيفة:
1. مرجع قوي: عادةً ما يكون المرجع الذي نرجعه عندما نقوم بإنشاء كائن جديد من خلال جديد هو مرجع قوي. إذا كان يمكن الوصول إلى كائن من خلال سلسلة من المراجع القوية ، يمكن الوصول إليه بشدة ، فلن يتم إعادة تدويره.
2. المرجع الناعم: الفرق بين المرجع الناعم والمرجع الضعيف هو أنه إذا كان الكائن يمكن الوصول إليه من خلال مرجع ضعيف ، فسيتم إعادة تدويره بغض النظر عما إذا كانت الذاكرة الحالية كافية ، في حين أن الكائن الذي يمكن الوصول إليه بواسطة مرجع ناعم لن يتم إعادة تدويره إلا عندما تكون الذاكرة غير كافية. لذلك ، المراجع الناعمة "أقوى" من المراجع الضعيفة.
3. مرجع الوهمية: المرجع الافتراضي هو أضعف مرجع في جافا ، إذن ما مدى ضعفه؟ إنه أمر هش لدرجة أنه لا يمكننا حتى الحصول على الكائن المشار إليه من خلال المراجع الافتراضية. الغرض الوحيد من المراجع الافتراضية هو أنه عند إعادة تدوير الكائن الذي يشير إليه ، ستتم إضافة المرجع الافتراضي نفسه إلى قائمة الانتظار المرجعية واستخدامها لتسجيل أن الكائن الذي يشير إليه قد تمت إعادة تدويره.
2. لماذا-لماذا تستخدم المراجع الضعيفة؟
ضع في اعتبارك السيناريو التالي: يوجد الآن فئة Product تمثل منتجًا ، مصممًا ليكون غير قابل للتطبيق ، وفي هذا الوقت نريد إضافة رقم إلى كل منتج. أحد الحلول هو استخدام HashMap<Product, Integer> . لذلك تأتي المشكلة. إذا لم نعد نحتاج إلى كائن Product للوجود في الذاكرة (على سبيل المثال ، تم بيع هذا المنتج) ، على افتراض أن الإشارة إليها هي productA ، سنقوم بتعيين قيمة إلى productA على أنها null . ومع ذلك ، في هذا الوقت ، لن يتم إعادة تدوير كائن Product الذي أشار إليه productA في الماضي ، لأنه من الواضح أنه يشير إليه HashMap . لذلك في هذه الحالة ، إذا أردنا إعادة تدوير كائن Product حقًا ، فهذا لا يكفي فقط لتعيين مرجعه القوي إلى null ، ونحن بحاجة أيضًا إلى إزالة الإدخال المقابل من HashMap . من الواضح أننا لا نريد إكمال عمل "إزالة لم تعد هناك حاجة إلى إدخالات من HashMap " من قبل أنفسنا. نريد أن نخبر جامع القمامة: فقط key في HashMap يشير إلى كائن Product ، يمكن إعادة تدوير كائن Product المقابل. من الواضح ، استنادًا إلى التعريف السابق للاستشهادات الضعيفة ، يمكن أن يساعدنا استخدام الاستشهادات الضعيفة في تحقيق هذا الهدف. نحتاج فقط إلى استخدام كائن مرجعي ضعيف يشير إلى كائن Product key في HashMap .
3. كيف-كيف لاستخدام المراجع الضعيفة؟
خذ السيناريو الذي تم تقديمه أعلاه كمثال. نستخدم كائن مرجعي ضعيف يشير إلى كائن Product key HashMap ، ونحدد هذا الكائن المرجعي الضعيف مثل هذا:
Producta Producta = منتج جديد (...) ؛ Properference <dorder> promproducta = New Deperference <> (Producta) ؛
الآن ، إذا تمت الإشارة إلى الكائن weakProductA ، فإنه يشير إلى productA كائن Product . إذن كيف نحصل على Product كائن productA الذي يشير إليه من خلال weakProduct ؟
الأمر بسيط للغاية ، فقط بحاجة إلى الكود التالي:
منتج المنتج = premproducta.get () ؛
في الواقع ، في هذه الحالة ، توفر لنا مكتبة فئة Java فئة WeakHashMap . باستخدام هذا الفئة ، يكون مفتاحه كائنًا مرجعيًا ضعيفًا بشكل طبيعي ، ولم نعد بحاجة إلى لف الكائن الأصلي يدويًا. وبهذه الطريقة ، عندما تصبح productA null (تشير إلى أن Product الذي يشير إليه لم يعد يحتاج إلى وجود في الذاكرة) ، Product المرجعي الضعيف هو weakProductA ، فمن الواضح أن كائن Product المقابل يكون ضعيفًا ويمكن الوصول إليه في هذا الوقت ، وبالتالي فإن المرجع الضعيف الذي يشير إليه سيتم مسحه ، وسيتم إعادة تدوير كائن Product ، والمرجع الضعيف للدخول إلى قائمة انتظار المرجع.
4. قائمة الانتظار المرجعية
دعونا نقدم بإيجاز مفهوم الإشارة إلى قوائم الانتظار. في الواقع ، فإن فئة WeakReference لديها مُنشئين:
// قم بإنشاء إشارة ضعيفة إلى الكائن المعطى الضعيف (مرجع T) // قم بإنشاء إشارة ضعيفة إلى الكائن المحدد وتسجيل إشارة ضعيفة إلى وضع قائمة انتظار المرجعية المعينة (مرجع T ، مرجعية <؟ super t> q)
يمكننا أن نرى أن المنشئ الثاني يوفر معلمة من النوع ReferenceQueue . من خلال توفير هذه المعلمة ، نقوم بتسجيل كائن مرجعي ضعيف تم إنشاؤه في قائمة انتظار مرجعية. وبهذه الطريقة ، عندما يتم مسحه بواسطة جامع القمامة ، سيتم إرساله إلى قائمة الانتظار المرجعية ، ويمكننا إدارة هذه الكائنات المرجعية الضعيفة التي تم تنظيفها بطريقة موحدة.
5. ملخص
حسنًا ، ينتهي محتوى هذه المقالة هنا. نظرًا للمستوى الشخصي المحدود ، هناك جوانب غير دقيقة أو غير واضحة في السرد. آمل أن تتمكن من الإشارة إليها ، شكرًا لك على دعمك لموقع Wulin.com.