2010-10-18 11 views
8

क्या जावा में ThreadLocal के विशिष्ट इस्तेमाल होता है का उपयोग करता है। जब कोई इसका इस्तेमाल करता है? मैं इस java docs आलेख से आवेदन विवरण नहीं दे सका।ThreadLocal

+2

के संभावित डुप्लिकेट [कब और कैसे मैं एक ThreadLocal चर का उपयोग करना चाहिए?] (Http://stackoverflow.com/questions/817856/when-and-how-should-i-use-a-threadlocal- चर) – YoK

उत्तर

4

जब आप वस्तुओं है कि सुरक्षित थ्रेड नहीं हैं, लेकिन (प्रदर्शन के कारणों के लिए) उन तक पहुंच सिंक्रनाइज़ करने के लिए नहीं करना चाहते हैं का उपयोग करना चाहते है। अधिक या कम, आप वस्तु आप, कई बार उपयोग करने के लिए इतना है कि आप यह सुनिश्चित करें कि हर धागा कि कि एक्सेसर कॉल कर सकते हैं एक अलग, अप्रयुक्त एक हो जाता है की जरूरत के लिए एक्सेसर पैदा करते हैं। एक बहुत ही विशिष्ट प्रयोग SimpleDateFormat है, जो एक वर्ग है कि अगर यह धागा सुरक्षित थे, अपने उदाहरण स्थिर के रूप में, आदेश में एक ही उदाहरण पुन: उपयोग करने में घोषित किया जाएगा उपयोग करने के लिए है। Dr. Dobbs: Using Thread-Local Variables In Java

4

शायद अधिक निदर्शी उदाहरण आप के लिए अच्छा हो सकता है:

method1(): ... method2(somedata) ... 
method2(somedata): ... method3(somedata) ... 
method3(somedata): ... method4(somedata) ... 
method4(somedata): ... do something with somedata ... 

इस तरह की स्थितियों बहुस्तरीय आर्किटेक्चर में उदाहरण के लिए होते हैं (यूआई दूरस्थ मुखौटा कहता है, दूरदराज के

यहाँ एक अच्छा यह वर्णन लेख है मुखौटा अनुप्रयोग परत कहता है, अनुप्रयोग परत डोमेन परत कहता है, डोमेन स्तर का हठ परत कहता है, ...) उन तरीकों() विभिन्न वर्गों के हैं वहाँ में सबसे अधिक तरीकों के लिए अतिरिक्त पैरामीटर 'somedata' जोड़ने को छोड़कर इस तरह के डेटा पारित करने के लिए कोई अच्छा तरीका है हमारे कोड, यह ब्रेक जैसे खुले बंद सिद्धांत। इस समस्या का समाधान ThreadLocal है:

method1(): ... threadLocal.set(somedata); method2(); threadLocal.set(null); ... 
method2(): ... method3() ... 
method3(): ... method4() ... 
method4(): ... do something with threadLocal.get() ... 
5

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

उदाहरण डीबी कनेक्शन हैं, सत्र हाइबरनेट आदि आप अपने प्रवाह की शुरुआत में कहीं उन्हें खोलने, बंद प्रवाह के अंत में प्रतिबद्ध/और प्रवाह के दौरान हर जगह का उपयोग करें।

0

यदि आपका प्रवाह धागे से जुड़ा हुआ है, जैसे एलेक्सआर का उल्लेख है, तो आप को private static final ThreadLocal<T> p संपत्ति के साथ बना सकते हैं, एक्सेसर विधियां जोड़ें। फिर आप अपने प्रवाह के साथ क्रमशः p.set(), p.remove(), और p.get() का उपयोग कर सकते हैं।

public final class C { 
    private static final ThreadLocal<String> p = new ThreadLocal<String>(); 

    // initialize property at the begining of your thread (flow) 
    public static void set(final String s){ 
     p.set(s); 
    } 

    // use property during the thread's lifecycle 
    // for instance: C.get().equals(myString) 
    public static String get(){ 
     return p.get(); 
    } 

    // remember to remove property from the thread when you're done, specially if it came from a thread pool 
    public static void remove(){ 
     p.remove(); 
    } 
} 
संबंधित मुद्दे