2010-05-06 15 views
82

मैं यहाँक्यों जावा ThreadLocal चर स्थिर

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html

Threadlocal के लिए JavaDoc पढ़ रहा था होना चाहिए और यह कहते हैं "ThreadLocal उदाहरणों कक्षाओं में आम तौर पर निजी स्थिर क्षेत्रों है कि एक धागे से राज्य संबद्ध करने के लिए इच्छा (हैं उदाहरण के लिए, एक उपयोगकर्ता आईडी या लेनदेन आईडी)। "

लेकिन मेरा सवाल यह है कि उन्होंने इसे स्थिर (आमतौर पर) क्यों चुना है - यह चीजों को" प्रति थ्रेड "राज्य में थोड़ा उलझन में डाल देता है लेकिन फ़ील्ड स्थिर हैं?

उत्तर

96

अगर यह एक उदाहरण स्तर क्षेत्र थे, तो यह वास्तव में हो सकता है क्योंकि "प्रति थ्रेड - प्रति उदाहरण", बस एक गारंटी नहीं "प्रति थ्रेड।" यह आमतौर पर वह अर्थपूर्ण नहीं है जिसे आप ढूंढ रहे हैं।

आमतौर पर यह वस्तुओं है कि एक उपयोगकर्ता बातचीत के दायरे वाला कर रहे हैं, वेब अनुरोध, आदि की तरह कुछ पकड़े जाने पर आप उन्हें भी वर्ग के उदाहरण के लिए उप-दायरे वाले नहीं करना चाहती।
एक वेब अनुरोध => एक हठ सत्र।
नहीं एक वेब अनुरोध => वस्तु प्रति एक हठ सत्र।

+1

मैं इस स्पष्टीकरण चाहते क्योंकि यह दिखाता है कि कैसे ThreadLocal – kellyfj

+3

पर-धागा-प्रति-उदाहरण के लिए इस्तेमाल किया जा के लिए एक उपयोगी अर्थ हो सकता है, लेकिन उस पैटर्न के लिए सबसे अधिक उपयोग करता है तो कई वस्तुओं है कि यह उपयोग करने के लिए बेहतर होगा शामिल होगा एक ' ThreadLocal' को हैश-सेट का संदर्भ रखने के लिए जो प्रति-थ्रेड उदाहरणों के लिए ऑब्जेक्ट्स को मैप करता है। – supercat

+0

अच्छा स्पष्टीकरण! – ADJ

3

कारण यह है कि चर धागा के साथ जुड़े एक सूचक द्वारा ही पहुंचा रहे हैं। वे थ्रेड स्कोप के साथ वैश्विक चर जैसे कार्य करते हैं, इसलिए स्थिर निकटतम फिट है। इस तरह से आप थ्रेड स्थानीय स्थिति को पठार जैसी चीजों में प्राप्त करते हैं, इसलिए यह इतिहास और कार्यान्वयन का दुर्घटना हो सकता है।

9

यह होने की जरूरत नहीं है। महत्वपूर्ण बात यह है कि यह एक सिंगलटन होना चाहिए।

13

या तो इसे स्थिर बनाएं या यदि आप अपनी कक्षा में किसी भी स्थिर फ़ील्ड से बचने की कोशिश कर रहे हैं - कक्षा को स्वयं एक सिंगलटन बनाएं और फिर आप एक आवृत्ति स्तर थ्रेडलोकल का सुरक्षित रूप से उपयोग कर सकते हैं जब तक कि आपके पास ग्लोबल रूप से उपलब्ध सिंगलटन उपलब्ध न हो।

0

प्रति थ्रेड प्रति उदाहरण पर थ्रेडलोकल के लिए उपयोग यह है कि यदि आप ऑब्जेक्ट के सभी तरीकों में कुछ दिखाना चाहते हैं और इसे सामान्य क्षेत्र के लिए एक्सेस करने के सिंक्रनाइज़ किए बिना थ्रेड सुरक्षित है।

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