سؤال

ويمكن إعادة كتابة قطعة التعليمات البرمجية التالية ث / س باستخدام Collections.synchronizedMap() بعد الحفاظ على صحة في التزامن؟

Collections.synchronizedMap(new WeakHashMap<Class, Object>());

وأي بمعنى. وهناك شيء واحد من java.util.concurrent يمكن استخدامها بدلا من ذلك؟ علما بأن مجرد استبدال مع

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));

واضح لن تنجح

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

المحلول

الجوافة الصورة <لأ href = "https://google.github.io/guava /releases/23.0/api/docs/com/google/common/cache/CacheBuilder.html "يختلط =" noreferrer نوفولو "> الطبقة CacheBuilder تتيح لك القيام بذلك بسهولة.

CacheBuilder.newBuilder().weakKeys().build()

لاحظ أن هذا يغير دلالات المساواة الرئيسية لتكون == بدلا من .equals() والتي سوف لا يهم في قضيتك استخدام الحالات Class بل هو شرك محتمل.

نصائح أخرى

وأنا لا أعتقد هناك. في الواقع يوحي جافادوك تستخدم Collections.synchronizedMap ()

واضاف "مثل معظم جمع الصفوف، لم يتم مزامنة هذه الفئة. وتزامن WeakHashMap قد يتم بناؤها باستخدام طريقة Collections.synchronizedMap."

Cafeine هو منافس شعبية من ذاكرة الجوافة.

- keys automatically wrapped in weak references
- values automatically wrapped in weak or soft references

والاستعمال:

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
 .weakKeys()
 .weakValues()
 .build(key -> createExpensiveGraph(key));
<اقتباس فقرة>   

هل التفاف WeakHashMap في خريطة متزامنة لا يزال العمل   صحيح لماذا تريد أن تفعل، منذ سلة المهملات جامع   تعديل weakreferences مباشرة في أي وقت، وتجاوز   تزامن خريطة المجمع؟ أعتقد WeakHashMap يعمل فقط حقا في   نموذج الخيوط واحد.

وكما ذكر أعلاه، وثائق WeakHashMap على https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html يقول على وجه التحديد:

<اقتباس فقرة>   

و"قد يتم بناؤها A WeakHashMap متزامنة باستخدام   طريقة Collections.synchronizedMap "

والذي يعني بالنسبة لي أن هذا العمل يجب تقنية جنبا إلى جنب مع السلوك جامع القمامة في (ما لم الوثائق هي عربات التي تجرها الدواب!)

إذا كنت تستخدم جافا 7 وما فوق، يتم حل هذه الحالة استخدام بطريقة ذات ألوان مع ClassValue <لأ href = "https://docs.oracle.com/javase/7/docs/api/java/ لانج / ClassValue.html "يختلط =" noreferrer نوفولو "> https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html إذا كنت تحتاج إلى استخدام remove، التفكير مليا التزامن وقراءة وثيقة تماما.

إذا كنت تستخدم جافا 6 أو أقل. لا، لديك لمزامنة WeakHashMap.

هل التفاف WeakHashMap في خريطة متزامنة لا تزال تعمل بشكل صحيح على ما تريد القيام به، لأن جامع القمامة يمكن تعديل weakreferences مباشرة في أي وقت، وتجاوز خريطة المجمع متزامنة؟ أعتقد WeakHashMap يعمل فقط حقا في نموذج الخيوط واحد.

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