هل يمكن لأحد أن يشرح لي عندما يكون من المفيد استخدام صانع الخرائط أو Prefhashmaps؟

StackOverflow https://stackoverflow.com/questions/3617680

  •  26-09-2019
  •  | 
  •  

سؤال

لقد قرأت الكثير من الناس مثل صانع الخرائط من Google Guava (مجموعات) ، ومع ذلك لا يمكنني رؤية أي استخدامات جيدة لها.

لقد قرأت Javadoc ، وتقول أنها تتصرف مثل concurrenthashmap. كما يقول new MapMaker().weakKeys().makeMap() يمكن استخدامها دائمًا كبديل للمنزل ضعيفة.

ومع ذلك ، فإن قراءة Javadocs من concurrenthashmap و ضعيفة يجعلني أتساءل عندما يكون من المفيد استخدامه؟ يبدو لي أنه لا يمكنك الحصول على ضمان بأن كل ما تضعه في الخريطة سيكون هناك ، أم أساء فهمه؟

هل كانت مفيدة؟

المحلول

... وهذا هو النقطة إلى حد ما. المراجع الضعيفة مفيدة ، إذا كنت لا ترغب في (أو لا تستطيع تحمل) الاحتفاظ بكائن غير محدد في الذاكرة. النظر في حالة الاستخدام التالية: تحتاج إلى ربط المعلومات بالفصول. الآن ، نظرًا لأنك تعمل في بيئة ، حيث قد يتم إعادة تحميل الفصول الدراسية (على سبيل المثال ، بيئة tomcat ، أو OSGI) ، فأنت تريد أن يكون جامع القمامة قادرًا على استعادة الإصدارات القديمة من الفصل بمجرد أن تراه آمنًا للقيام بذلك .

محاولة أولية لتنفيذ هذا ، قد تبدو

class ClassAssoc {
    private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...;
}

المشكلة هنا هي: هذا من شأنه أن يبقي جميع الفصول في cache عضو إلى الأبد (أو على الأقل ، ما لم تتم إزالته يدويًا) ، مما يجبر جامع القمامة على الاحتفاظ بها بصراحة ، بما في ذلك كل شيء مشار إليه من الفصل (قيم الأعضاء الثابتة ، معلومات تحميل الفئة ، ...)

باستخدام المراجع الضعيفة ، يمكن لمجمع القمامة استعادة الإصدار القديم من الفصل بمجرد وجود إشارات أخرى (عادة ما تكون). من ناحية أخرى: طالما وجود هذه المراجع ، فإن القيمة مضمونة أيضًا للوصول إليها من الكائن المرجعي الضعيف ، وبالتالي ، هو مفتاح صالح في جدول ذاكرة التخزين المؤقت.

أضف التزامن وغيرها من الفظائع إلى الصورة ، وأنت في ماذا MapMaker اختياريا أيضا يوفر ...

نصائح أخرى

الشيء عن MapMaker هو أن هناك العديد من الخيارات لنوع الخريطة التي تقوم ببنائها ، والتي تمكن تلك الخرائط من تقديم العديد من الأغراض.

  • يعطي Dirk مثالًا جيدًا على استخدام المفاتيح الضعيفة.
  • تعد القيم الناعمة مفيدة للتخزين المؤقت ، حيث يمكنك تخزين القيم في الخريطة دون القلق بشأن نفاد الذاكرة نظرًا لأن النظام مجاني في إخلاء الإدخالات من ذاكرة التخزين المؤقت إذا كان يحتاج إلى ذاكرة.
  • يمكنك اختيار انتهاء صلاحية إدخالات بعد فترة معينة من الوقت. يعد هذا أيضًا مفيدًا للتخزين المؤقت ، حيث أنك قد ترغب في تخزين بعض البيانات مؤقتًا لفترة محددة من الوقت قبل إجراء عملية باهظة الثمن لتحديثها.
  • أحد الأشياء المفضلة لدي هو صنع خريطة حوسبة. تستخدم خريطة الحوسبة أ Function<K, V> لاسترداد القيمة المرتبطة تلقائيًا بمفتاح معين إذا لم يكن موجودًا بالفعل في الخريطة. هذا يجمع بشكل جيد مع القيم الناعمة و/أو أوقات انتهاء الصلاحية. بعد إدخال الإدخال بواسطة الخريطة (بسبب الطلب أو انتهاء صلاحية الذاكرة) ، في المرة التالية التي يتم فيها طلب القيمة المرتبطة بهذا المفتاح ، سيتم استرداد وتخزين مؤقت في الخريطة تلقائيًا مرة أخرى.

أ WeakHashmap سيتم الاحتفاظ بالدخول في الخريطة بينما يشير شخص ما (بخلاف الخريطة) إلى الإدخال. إذا لم يكن هناك أي شخص آخر ، فإن الخريطة تحتفظ بمرجع في الإدخال ، فيمكن إزالة الإدخال في تشغيل GC التالي.

ConcurrentHashMap هو Map والتي يمكن استخدامها بأمان في بيئة متعددة الخيوط. إنه أفضل من النسخة المتزامنة من العادية Map لان التزامن يعني أن الخيوط المختلفة غالبًا ما تكون متاحة للوصول إلى هذه الخريطة دون الحظر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top