एक थ्रेड निष्पादन की एक इकाई है और इसलिए एकाधिक थ्रेड एक ही समय में एक ही कोड निष्पादित कर सकते हैं। यदि एक ही समय में किसी ऑब्जेक्ट/इंस्टेंस पर एकाधिक थ्रेड निष्पादित होते हैं तो वे आवृत्ति चर साझा करेंगे। प्रत्येक थ्रेड के अपने स्थानीय चर होंगे लेकिन पैरामीटर पास किए बिना इन ऑब्जेक्ट्स को साझा करना मुश्किल है।
यह एक उदाहरण के माध्यम से सबसे अच्छा समझाया गया है। मान लें कि आपके पास एक सर्वलेट है जो उपयोगकर्ता में लॉग इन हो जाता है और फिर कुछ कोड निष्पादित करता है।
doGet(HttpServletRequest req, HttpServletResponse resp) {
User user = getLoggedInUser(req);
doSomething()
doSomethingElse()
renderResponse(resp)
}
अब क्या होता है यदि doSomething() विधियों को उपयोगकर्ता ऑब्जेक्ट तक पहुंच की आवश्यकता होती है? आप उपयोगकर्ता को एक आवृत्ति या स्थिर चर नहीं बना सकते हैं क्योंकि प्रत्येक थ्रेड उसी उपयोगकर्ता ऑब्जेक्ट का उपयोग करेगा। आप एक पैरामीटर के रूप आसपास उपयोगकर्ता वस्तु गुजर सकता है, लेकिन यह जल्दी से हर विधि कॉल में गंदा हो जाता है और लीक उपयोगकर्ता वस्तुओं:
doGet(HttpServletRequest req, HttpServletResponse resp) {
User user = getLoggedInUser(req);
doSomething(user)
doSomethingElse(user)
renderResponse(resp,user)
}
एक और अधिक सुरुचिपूर्ण समाधान एक ThreadLocal
doGet(HttpServletRequest req, HttpServletResponse resp) {
User user = getLoggedInUser(req);
StaticClass.getThreadLocal().set(user)
try {
doSomething()
doSomethingElse()
renderResponse(resp)
}
finally {
StaticClass.getThreadLocal().remove()
}
}
में उपयोगकर्ता वस्तु डाल करने के लिए है
अब किसी भी कोड है कि किसी भी समय उपयोगकर्ता वस्तु की आवश्यकता है धागा स्थानीय से निकाल कर यह की पकड़ प्राप्त कर सकते हैं, उन परेशान अतिरिक्त पैरामीटर का सहारा लेना जरूरत के बिना:
User user = StaticClass.getThreadLocal().get()
यदि आप इस दृष्टिकोण का उपयोग करते हैं तो अंत में ब्लॉक में ऑब्जेक्ट को फिर से निकालने के लिए सावधान रहें। अन्यथा उपयोगकर्ता ऑब्जेक्ट उन वातावरणों में घूम सकता है जो थ्रेड पूल (जैसे टोमकैट ऐप सर्वर) का उपयोग करते हैं।
संपादित करें: स्थिर वर्ग के लिए कोड
class StaticClass {
static private ThreadLocal threadLocal = new ThreadLocal<User>();
static ThreadLocal<User> getThreadLocal() {
return threadLocal;
}
}
यहां स्टेटिक क्लास क्या है? कक्षा जो थ्रेड फैली हुई है? – Ajay
स्टेटिक क्लास थ्रेडलोकल ऑब्जेक्ट को पकड़ने का एक आसान तरीका है। मैं स्टेटिक क्लास के लिए कोड शामिल करने के लिए उदाहरण संपादित करूंगा। – leonm
मैं नहीं कहूंगा कि यह हमेशा अधिक सुरुचिपूर्ण है, लेकिन यह अधिक उपयुक्त है –