2010-02-13 12 views
41

क्या कोड का निम्नलिखित भाग Collections.synchronizedMap() का उपयोग कर w/o को फिर से लिखा जा सकता है फिर भी समरूपता में शुद्धता बनाए रखना?क्या WeakHashMap के लिए java.util.concurrent समतुल्य है?

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

यानी java.util.concurrent से कुछ है जिसके बजाय कोई इसका उपयोग कर सकता है? ध्यान दें कि केवल

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

स्पष्ट रूप से साथ की जगह

+1

जैसे अत्यधिक समवर्ती डेटा संरचनाओं की महत्वपूर्ण लाभ 'ConcurrentHashMap' कि यह कर सकते हैं धागा सुरक्षित भारी बोझ के नीचे बिना है (विभिन्न तकनीकों का के माध्यम से) रहते हैं (बहुत) अवरुद्ध। यह जानना महत्वपूर्ण है कि यदि आपकी कक्षा भारी भार में नहीं है, तो ConcurrentHashMap के साथ आपका प्रदर्शन हैश मैप के मुकाबले * खराब * हो सकता है। यदि आपका पर्यावरण बड़े पैमाने पर विवाद से मुक्त होने की उम्मीद है कि आप बाहरी सिंक्रनाइज़ेशन का उपयोग कर सकते हैं और आप ठीक होंगे। – scottb

उत्तर

33

Guava की CacheBuilder कक्षा आपको यह आसानी से करने की अनुमति देती है।

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

ध्यान दें कि यह बदलता है कुंजी समानता अर्थ विज्ञान == बजाय .equals() जो Class उदाहरणों का उपयोग कर के अपने मामले में कोई फर्क नहीं होगा, लेकिन एक संभावित ख़तरा है किया जाना है।

+0

सामान्य समानता के समान समानता को अनुकूलित करने का कोई तरीका है? – gstackoverflow

+0

गुवा के लिए अद्यतन लिंक: https://github.com/google/guava और कैशबिल्डर के लिए अपडेट किया गया लिंक: https://google.github.io/guava/releases/18.0/api/docs/com/google/common/ कैश/कैशबिल्डरर –

18

मैं नहीं मानता है काम नहीं करेगा। वास्तव में javadoc संग्रह .synchronizedMap()

"अधिकांश संग्रह वर्गों की तरह, इस वर्ग को सिंक्रनाइज़ नहीं किया गया है। सिंक्रनाइज़ किए गए WeakHashMap को संग्रह। सिंक्रनाइज़ किए गए मैप विधि का उपयोग करके बनाया जा सकता है।"

+0

दुर्भाग्यपूर्ण है कि इसमें कोई PutIfAbsent विधि नहीं है ... – rogerdpack

+0

@rogerdpack: लेकिन आप हमेशा एक वीक हैशैप को रोल-अप-थ्रेड में अपने थ्रेडसेफवेक हैशमैप में लिख सकते हैं और मॉनीटर लॉक का उपयोग करके, अपना खुद का putIfAbsent (...) बहुत आसानी से। इस बात से सहमत था कि यह भारी भार के अधीन उप-अधीन होगा लेकिन सबकुछ भारी लोड नहीं होता है। – scottb

+1

@rogerdpack अब यह करता है, जावा 8 ftw – qualidafial

-1

सिंक्रनाइज़ किए गए मानचित्र में WeakHashMap को लपेटना अभी भी सही काम करता है जो आप करना चाहते हैं, क्योंकि कचरा कलेक्टर सिंक्रनाइज़ किए गए मानचित्र रैपर को छोड़कर, किसी भी समय सीधे कमजोरियों को संशोधित कर सकता है? मुझे लगता है कि WeakHashMap केवल एक थ्रेडेड मॉडल में वास्तव में काम करता है।

0

एक तुल्यकालन नक्शे में WeakHashMap लपेटकर अभी भी सही ढंग कि आप क्या करना चाहते हैं के लिए काम करते हैं, के बाद से कचरा कलेक्टर किसी भी समय सीधे weakreferences संशोधित कर सकते हैं, सिंक्रनाइज़ नक्शा आवरण को दरकिनार करता है? मुझे लगता है कि WeakHashMap केवल सिंगल थ्रेडेड मॉडल में वास्तव में काम करता है।

ऊपर उल्लेख किया है, https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html पर WeakHashMap के लिए दस्तावेज़ विशेष रूप से कहते हैं:

कौन सा मेरे लिए अर्थ है "एक सिंक्रनाइज़ WeakHashMap Collections.synchronizedMap विधि का उपयोग कर निर्माण किया जा सकता है" कि इस तकनीक को कचरा कलेक्टर के व्यवहार के साथ मिलकर काम करना चाहिए (जब तक कि दस्तावेज बग्गी न हो!)

+0

सही। जेवीएम हमेशा बहु थ्रेडेड होता है। जीसी धागे, फाइनेंजर धागे, और अन्य हैं। यदि WeakHashMap स्पष्ट रूप से बहुप्रचारित जावा प्रोग्राम में काम नहीं करता है, तो यह देखना मुश्किल है कि यह एकल-थ्रेडेड में कैसे काम कर सकता है। – Doradus

0

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)); 
संबंधित मुद्दे