2010-09-01 9 views
5

मैंने कई लोगों को वास्तव में Google Guava (संग्रह) के MapMaker की तरह पढ़ा है, हालांकि मुझे इसका कोई अच्छा उपयोग नहीं दिखाई दे रहा है।क्या कोई मुझे बता सकता है जब यह MapMaker या WeakHashMaps का उपयोग करने में उपयोगी होता है?

मैंने जावाडोक पढ़ा है, और यह कहता है कि यह ConcurrentHashMap जैसा व्यवहार करता है। यह भी कहता है कि new MapMaker().weakKeys().makeMap() लगभग WeakHashMap के लिए हमेशा ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग किया जा सकता है।

हालांकि, ConcurrentHashMap और WeakHashMap के javadocs को पढ़ने से मुझे आश्चर्य होता है कि यह उपयोग करने में उपयोगी है? मुझे ऐसा लगता है कि आप इस बात की गारंटी नहीं दे सकते कि जो भी आप मानचित्र में डालते हैं वह वहां होगा, या क्या मैंने गलत समझा है?

उत्तर

6

... और यह कुछ हद तक इसका मुद्दा है। कमजोर संदर्भ उपयोगी हैं, अगर आप स्मृति में अनिश्चित रूप से किसी ऑब्जेक्ट को बनाए रखना नहीं चाहते हैं (या बर्दाश्त नहीं कर सकते हैं)। निम्नलिखित उपयोग मामले पर विचार करें: आपको कक्षाओं के साथ जानकारी को जोड़ना होगा। अब, चूंकि आप किसी ऐसे माहौल में दौड़ रहे हैं, जहां वर्गों को फिर से लोड किया जा सकता है (कहें, एक टोमकैट, या ओएसजीआई पर्यावरण), आप चाहते हैं कि कचरा कलेक्टर एक वर्ग के पुराने संस्करणों को पुनः प्राप्त करने में सक्षम हो, जैसे ही यह ऐसा करने के लिए सुरक्षित लगता है ।

इस लागू करने के लिए एक प्रारंभिक प्रयास, जैसे

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

समस्या यहां लग सकता है: यह हमेशा के लिए cache सदस्य में सभी वर्गों रखना होगा (कम से कम, जब तक वे मैन्युअल रूप से निकाल दिए जाते हैं या), के लिए मजबूर कचरा कलेक्टर उन्हें अनिश्चित रूप से बनाए रखने के लिए, कक्षा से संदर्भित सबकुछ (स्थिर सदस्य मूल्य, वर्ग लोडर जानकारी, ...)

कमजोर संदर्भों का उपयोग करके, कचरा कलेक्टर कक्षा के पुराने संस्करण को किसी अन्य के रूप में जल्द से जल्द पुनः प्राप्त कर सकता है इसके संदर्भ (आमतौर पर उदाहरण) मौजूद हैं। दूसरी तरफ: जब तक इस तरह के संदर्भ मौजूद हैं, मूल्य कमजोर संदर्भ वस्तु से भी पहुंचने योग्य है, और इस प्रकार, कैश तालिका में एक वैध कुंजी है।

तस्वीर के लिए संगामिति और अन्य अत्याचारों जोड़ें, और तुम क्या MapMaker वैकल्पिक रूप से भी प्रावधान है पर हैं ...

0

WeakHashmap प्रविष्टि नक्शे में रखी जाएगी जबकि कोई (मानचित्र के अलावा) प्रविष्टि का संदर्भ दे रहा है। यदि नक्शा का कोई और हिस्सा प्रवेश पर संदर्भ नहीं रखता है, तो प्रविष्टि को अगले जीसी रन पर हटाया जा सकता है।

-2

ConcurrentHashMap एक Map जो सुरक्षित रूप से बहु सूत्रण वातावरण में इस्तेमाल किया जा सकता है। यह नियमित Map के सिंक्रनाइज़ संस्करण से बेहतर है क्योंकि concurrency का अर्थ है कि अवरुद्ध किए बिना इस मानचित्र तक पहुंचने के लिए अलग-अलग थ्रेड अक्सर उपलब्ध होते हैं।

+0

यह कैसे प्रश्न पूछता है? – whiskeysierra

7

MapMaker के बारे में बात यह है कि आपके द्वारा बनाए गए मानचित्र के लिए कई विकल्प हैं, जो उन मानचित्रों को कई उद्देश्यों को पूरा करने में सक्षम बनाता है।

  • डिर्क कमजोर कुंजियों के उपयोग के लिए एक अच्छा उदाहरण देता है।
  • सॉफ्ट मूल्य कैशिंग के लिए उपयोगी हैं, क्योंकि आप मेमोरी से बाहर निकलने के बारे में चिंता किए बिना मानचित्र में मूल्य कैश कर सकते हैं क्योंकि सिस्टम को कैश से प्रविष्टियों को बेदखल करने के लिए स्वतंत्र है, अगर उसे स्मृति की आवश्यकता है।
  • आप एक निश्चित समय के बाद प्रविष्टियां समाप्त होने का चयन कर सकते हैं। यह कैशिंग के लिए भी उपयोगी है, क्योंकि आप इसे अद्यतन करने के लिए एक महंगी ऑपरेशन करने से पहले एक विशिष्ट अवधि के लिए कैश किए गए कुछ डेटा चाहते हैं।
  • मेरी पसंदीदा चीजों में से एक कंप्यूटिंग मानचित्र बना रहा है। एक कंप्यूटिंग मैप Function<K, V> का उपयोग किसी दिए गए कुंजी से जुड़े मान को स्वचालित रूप से पुनर्प्राप्त करने के लिए करता है यदि यह पहले से ही मानचित्र में नहीं है। यह नरम मान और/या समाप्ति समय के साथ अच्छी तरह से जोड़ती है। एक प्रवेश, अगली बार जब कि कुंजी से संबद्ध मूल्य अनुरोध किया जाता है तो यह स्वचालित रूप से एक बार पुनः प्राप्त हो जाएगा और संचित मैप में (स्मृति मांग या समाप्ति के कारण) मानचित्र से बेदखल कर दिए जाने के बाद।
+0

इच्छा है कि मैं दो उत्तरों स्वीकार कर सकता हूं क्योंकि आपका भी सहायक है –

संबंधित मुद्दे