2012-06-25 9 views
6

के बारे में उलझन में मैंने आज सुबह थ्रेडलोकल के बारे में सीखा। मैंने पढ़ा है कि यह हमेशा के लिए अंतिम और स्थिर होना चाहिए की तरह:थ्रेडलोकल

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 

(सत्र एक हाइबरनेट सत्र है)

मेरे भ्रम की स्थिति यह है: क्योंकि यह स्थिर है, यह JVM में किसी भी धागा करने के लिए उपलब्ध है। फिर भी यह प्रत्येक थ्रेड के लिए स्थानीय जानकारी रखेगा जो इसे एक्सेस करता है? मैं इसके चारों ओर अपने सिर को लपेटने की कोशिश कर रहा हूं इसलिए अगर यह अस्पष्ट है तो मैं क्षमा चाहता हूं। एप्लिकेशन में प्रत्येक थ्रेड के पास एक ही थ्रेडलोकल ऑब्जेक्ट तक पहुंच है, लेकिन थ्रेडलोकल ऑब्जेक्ट ऑब्जेक्ट को प्रत्येक थ्रेड में स्थानीय स्टोर करेगा?

+3

साझा वातावरण में तैनात वेब अनुप्रयोगों में इसका उपयोग करने से सावधान रहें। धागा स्थानीय सभी संदर्भों में रिसाव करेगा और थ्रेड स्थानीय में संदर्भों को पूर्ववत करने के बाद कचरा इकट्ठा नहीं किया जाएगा। मैन्युअल रूप से प्रत्येक अनुरोध के बाद आपको डेटा को हटाने की आवश्यकता है। – jontro

+0

यह प्रतीत होता है विरोधाभासी है। प्रत्येक धागे में 'थ्रेडलोकल' अद्वितीय होना चाहिए, लेकिन प्रत्येक धागे के बीच स्थैतिक वस्तुएं साझा की जाती हैं। बस यही सवाल पूछने वाला था। – aliteralmind

उत्तर

10

हां, उदाहरण वही होगा, लेकिन जब आप सेट करते हैं और जब आप पुनर्प्राप्त करते हैं, तो कोड Thread.currentThread() के साथ सेट किए गए मान को जोड़ता है, इसलिए मान सेट केवल मौजूदा थ्रेड के भीतर पहुंच योग्य होगा जब विधियों का उपयोग करके एक्सेस किया जा सके set और get

इसे समझना वाकई आसान है।

कल्पना कीजिए कि प्रत्येक Thread में एक नक्शा है जो मान को ThreadLocal उदाहरण से जोड़ता है। प्रत्येक बार जब आप ThreadLocal पर एक सेट या सेट करते हैं, तो ThreadLocal का कार्यान्वयन वर्तमान Thread (Thread.currentThread()) से संबंधित नक्शा प्राप्त करता है और उस मानचित्र में get या set को अपने आप का उपयोग करके मानचित्र में प्रदर्शित करता है।

उदाहरण:

ThreadLocal tl = new ThreadLocal(); 
tl.set(new Object()); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.put(tl, [object you gave]) 

Object obj = t1.get(); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.get(tl) 

और इस पर दिलचस्प बात यह है कि ThreadLocal hierarchic है, जिसका अर्थ है कि यदि आप एक माता पिता Thread के लिए मान निर्धारित यह एक बच्चे को एक से सुलभ हो जाएगा।

+0

धन्यवाद, यह बहुत मदद करता है। – badgerduke

+0

आपका स्वागत है! –

+0

आप कहते हैं कि 'थ्रेडलोकल' में एक नक्शा है। मुझे अवधारणा मिलती है। थ्रेड आईडी कुंजी है, अद्वितीय उदाहरण मान हैं। तो कुल 'थ्रेडलोकल 'ऑब्जेक्ट स्थिर है, और प्रति थ्रेड एक मान रखता है। क्या यह वास्तव में एक आंतरिक मानचित्र के साथ लागू किया गया है? – aliteralmind

2

आप हमेशा एक विशिष्ट समस्या के लिए थ्रेडलोकल के एक ही उदाहरण तक पहुंचते हैं लेकिन यह उदाहरण प्रत्येक थ्रेड के लिए get विधि को कॉल करने के लिए एक अलग मान देता है।

यह बात है: वस्तु को ढूंढना आसान है लेकिन प्रत्येक धागे का अपना विशिष्ट मूल्य होगा। इस प्रकार आप उदाहरण के लिए सुनिश्चित कर सकते हैं कि आपका विशिष्ट मान दो अलग-अलग धागे से नहीं पहुंचाया जाएगा।

आप इसे (अवधारणात्मक रूप से) HashMap<Thread><V> के रूप में देख सकते हैं जिसे हमेशा Thread.currentThread() के साथ कुंजी के रूप में उपयोग किया जाएगा।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद! – badgerduke

2

क्योंकि थ्रेड-विशिष्ट मान ThreadLocal ऑब्जेक्ट में संग्रहीत नहीं हैं, लेकिन current Thread का ThreadLocalMap है। ThreadLocal ऑब्जेक्ट केवल इन मानचित्रों में महत्वपूर्ण के रूप में कार्य करता है।

विवरण के लिए, ThreadLocal और उप-वर्गों के जावाडोक को पढ़ें, या यदि आप कार्यान्वयन के बारे में उत्सुक हैं, तो प्रत्येक हालिया जेडीके src.zip में उपलब्ध स्रोत कोड।

+0

धन्यवाद, इससे मदद मिली! – badgerduke

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