2011-06-26 14 views
6

मैंने हाल ही में कोड का एक टुकड़ा देखा जो ThreadLocal ऑब्जेक्ट का उपयोग करता था और इसके अंदर ConcurrentHashMap रखता था।क्या थ्रेडलॉक पर थ्रेडसेफ ऑब्जेक्ट डालने में कोई फायदा है?

क्या इसमें कोई तर्क/लाभ है, या यह अनावश्यक है?

+0

@Downvoter - समझाने की देखभाल? – RonK

+0

यहां कुछ लोग हैं जो बस बिना किसी टिप्पणी के ... नीचे ... मैं बिना टिप्पणी के डाउनवॉट्स की अनुमति नहीं दूंगा ... – Cris

उत्तर

7

समवर्ती hashmap को केवल संदर्भ ThreadLocal में रहता है, तो जाहिर है hashmap केवल एक ही धागे से संदर्भित है। ऐसे मामले में मैं कहूंगा कि यह पूरी तरह से अनावश्यक है।

हालांकि, यह कोई कल्पना करना अन्य धागे के साथ "साझा करने" धागे की स्थानीय रूप से संग्रहीत hashmap मुश्किल नहीं है:

ThreadLocal<ConcurrentHashMap<String, String>> tl = ... 

// ... 

final ConcurrentHashMap<String, String> props = tl.get(); 

EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     props.add(key.getText(), val.getText()); 
    } 
}); 
+0

दरअसल। 'थ्रेडलोकल 'एन धागे को एन स्वतंत्र चर के लिए अनुमति देता है - यह बिल्कुल मौजूद वस्तुओं से संबंधित नहीं हो सकता है (प्रत्येक थ्रेडलोकल की एक अलग और/या अद्वितीय वस्तु नहीं है)। –

+0

अच्छा बिंदु - मैं जांच करूंगा कि ऐसा उपयोग है या नहीं। – RonK

0

या तो वह ThreadLocal को गलत तरीके से इस्तेमाल किया है, या ConcurrentHashMap को गलत तरीके से। संयोजन की भावना 0 के करीब है।

+0

यह सही नहीं है। ऐसे ध्वनि उपयोग-मामले हैं जहां थ्रेड लोकल में ऑब्जेक्ट एकाधिक थ्रेड द्वारा साझा किया जाता है। –

0

@aioobe ने जो कहा, उसके अलावा InheritableThreadLocal के मामले पर विचार करें, जिसमें स्थानीय का मूल्य थ्रेड से प्रत्येक बच्चे धागे को पारित किया जाता है।

और जैसा कि @pst कहता है, अलग-अलग (गैर विरासत योग्य) ThreadLocal एस में समान मूल्य को रोकने के लिए कुछ भी नहीं है।

संक्षेप में, आपको थ्रेड स्थानीय लोगों का एक संपूर्ण विश्लेषण करना है, जिस तरह से उन्हें प्रारंभ किया गया है और जिस तरीके से उनका उपयोग किया जाता है, वे सुरक्षित रूप से निष्कर्ष निकाल सकते हैं कि उन्हें थ्रेडसेफ होने की आवश्यकता नहीं है।

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