थ्रेडलोक गैर-सिंक्रनाइज़ विधि में कई थ्रेड्स द्वारा उत्परिवर्तित ऑब्जेक्ट तक पहुंच सुनिश्चित करेगा, सिंक्रनाइज़ किया गया है, जिसका अर्थ है कि विधि के भीतर उत्परिवर्तनीय वस्तु को अपरिवर्तनीय बनाया जा सकता है।
इसे प्राप्त करने की कोशिश करने वाले प्रत्येक थ्रेड के लिए उत्परिवर्तनीय वस्तु का नया उदाहरण देकर इसे प्राप्त किया जाता है। तो यह प्रत्येक थ्रेड के लिए स्थानीय प्रतिलिपि है। यह स्थानीय चर की तरह एक्सेस किए जाने वाले तरीके में उदाहरण चर बनाने पर कुछ हैक है। जैसा कि आप जानते हैं कि विधि स्थानीय चर केवल थ्रेड के लिए उपलब्ध है, एक अंतर है; विधि निष्पादन के बाद जहां स्थानीय ऑब्जेक्ट वैरिएबल थ्रेड के लिए उपलब्ध नहीं होगा, जहां थ्रेडलोक के साथ साझा की गई म्यूटेबल ऑब्जेक्ट कई तरीकों से उपलब्ध होगी, जब तक हम इसे साफ नहीं करते।
परिभाषा से:
जावा में थ्रेडलोकल क्लास आपको वैरिएबल बनाने में सक्षम बनाता है जिसे केवल उसी थ्रेड द्वारा पढ़ा और लिखा जा सकता है। इस प्रकार, भले ही दो थ्रेड्स एक ही कोड को निष्पादित कर रहे हों, और कोड में थ्रेडलोक वैरिएबल का संदर्भ हो, तो दोनों थ्रेड एक दूसरे के थ्रेडलोक वैरिएबल को नहीं देख सकते हैं।
Thread
जावा में प्रत्येक में होता ThreadLocalMap
है।
कहाँ पे
Key = One ThreadLocal object shared across threads.
value = Mutable object which has to be used synchronously, this will be instantiated for each thread.
थ्रेडलोक को प्राप्त करना:
अब थ्रेडलोक के लिए एक रैपर क्लास बनाएं, जो नीचे (जैसे या बिना initialValue()
) के परस्पर परिवर्तन योग्य वस्तु को धारण करने वाला है ।
अब इस रैपर का गेटटर और सेटर, म्यूटेबल ऑब्जेक्ट के बजाय थ्रेडलोकल उदाहरण पर काम करेगा।
यदि थ्रेडलोक के गेटर () को थ्रेडलोकैम्पैम्प के साथ कोई मान नहीं मिला Thread
; तब यह इनिशियलव्यू () को धागे के संबंध में अपनी निजी कॉपी प्राप्त करने के लिए आमंत्रित करेगा।
class SimpleDateFormatInstancePerThread {
private static final ThreadLocal<SimpleDateFormat> dateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd") {
UUID id = UUID.randomUUID();
@Override
public String toString() {
return id.toString();
};
};
System.out.println("Creating SimpleDateFormat instance " + dateFormat +" for Thread : " + Thread.currentThread().getName());
return dateFormat;
}
};
/*
* Every time there is a call for DateFormat, ThreadLocal will return calling
* Thread's copy of SimpleDateFormat
*/
public static DateFormat getDateFormatter() {
return dateFormatHolder.get();
}
public static void cleanup() {
dateFormatHolder.remove();
}
}
अब wrapper.getDateFormatter()
कॉल करेंगे threadlocal.get()
और उस की जाँच करेगा currentThread.threadLocalMap
शामिल हैं इस (threadlocal) उदाहरण।
यदि हां इसी थ्रेडलोकल उदाहरण के लिए मान (SimpleDateFormat) लौटाएं
तो मानचित्र को इस थ्रेडलोक उदाहरण, initialValue () के साथ जोड़ें।
इस उत्परिवर्ती वर्ग पर हासिल की गई सुरक्षा के साथ-साथ थ्रेड की सुरक्षा; प्रत्येक थ्रेड द्वारा अपने स्वयं के परिवर्तनशील उदाहरण के साथ काम कर रहा है लेकिन उसी थ्रेडलोक उदाहरण के साथ। इसका मतलब है कि सभी थ्रेड कुंजी के रूप में एक ही थ्रेडलोक उदाहरण को साझा करेंगे, लेकिन मूल्य के रूप में अलग-अलग SimpleDateFormat उदाहरण।
https://github.com/skanagavelu/yt.tech/blob/master/src/ThreadLocalTest.java