मैं कैसे सुनिश्चित करूं कि मेरे जावा सर्वलेट वेब एप्लिकेशन थ्रेड सुरक्षित है? सत्र चर, कक्षा के स्थैतिक चर, या किसी अन्य चीज के संबंध में मुझे थ्रेड-सुरक्षा समस्या के संबंध में क्या करने की आवश्यकता है?जावा में, मैं कैसे सुनिश्चित करूं कि मेरा वेब एप्लिकेशन थ्रेड सुरक्षित है?
उत्तर
तथ्य: वहाँ वेब ऐप्लिकेशन की में है एक सर्वलेट का केवल 1 उदाहरण जीवन काल। यह वेबएप के स्टार्टअप पर बनाया गया है और यह वेबएप के शटडाउन पर नष्ट हो गया है। किसी न किसी व्याख्या के लिए this answer भी देखें।
इस प्रकार, यह सभी अनुरोधों (धागे) के बीच साझा किया गया है। यदि आप उदाहरण के रूप में अनुरोध या सत्र स्कॉप्ड डेटा असाइन करते हैं (या इससे भी बदतर, static
) चर के रूप में, तो यह निश्चित रूप से थ्रेडसेफ नहीं है, क्योंकि इसे सभी उपयोगकर्ताओं (सत्र) से सभी अनुरोधों (थ्रेड) के बीच साझा किया गया है। उन्हें थ्रेडसेफ रखने के लिए उन्हें बस स्थानीय चर के रूप में असाइन करने की आवश्यकता है। तो:
public class MyServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
मूल रूप से आपको ध्यान में रखना होगा जब थ्रेडस्फीटी के साथ सर्वलेट विकसित करना होगा।
फिर सत्र (HttpSession
) विशेषताएँ हैं जिन्हें एक ही उपयोगकर्ता से कई अनुरोधों के बीच साझा किया जा सकता है, लेकिन वास्तविक दुनिया में आपको वास्तव में सत्र पहुंच सिंक्रनाइज़ करने की चिंता करने की आवश्यकता नहीं है। आप आमतौर पर केवल उपयोगकर्ता-विशिष्ट डेटा डालते हैं, जैसे लॉग-इन उपयोगकर्ता, उपयोगकर्ता-विशिष्ट प्राथमिकताएं, खरीदारी टोकरी, आदि। आपको बस यह सुनिश्चित करने की ज़रूरत है कि आप सत्र स्कोप में शुद्ध अनुरोध स्कॉप्ड डेटा नहीं डालते हैं। यह उसी सत्र के अंदर कई ब्राउज़र विंडो/टैब में दिखाई देगा।
फिर आवेदन (ServletContext
) विशेषताएँ हैं जो सभी उपयोगकर्ताओं के बीच साझा की जाती हैं, लेकिन आप सामान्य रूप से केवल वेबकैन्स कॉन्फ़िगरेशन, डीएओ फैक्ट्री, ड्रॉपडाउनलिस्ट सामग्री इत्यादि जैसे स्थिरांक और अन्य स्थिर डेटा डालते हैं।यह सब ServletContextListener
के साथ किया जा सकता है, मूल उदाहरण के लिए this answer भी देखें। आपको बस यह सुनिश्चित करने की ज़रूरत है कि आप शुद्ध अनुरोध नहीं करते- या एप्लिकेशन स्कोप में सत्र स्कॉप्ड डेटा नहीं डालते हैं।
क्या आप किसी अन्य जावा एप्लिकेशन के विरोध में संदर्भ में हैं? वास्तव में बहुत अंतर नहीं है। सर्वलेट के लिए प्रत्येक अनुरोध कंटेनर को इसे संभालने के लिए एक नया धागा जारी करने का कारण बनता है, इसलिए सर्वलेट के भीतर आवृत्ति चर थ्रेड-सुरक्षित होना चाहिए। DoGet/doPost() विधियों में स्थानीय चर के साथ अपने सभी बिज़ को संभालना बेहतर है। एक गोचाचा है जिसे मैं सोच सकता हूं। सत्र चर के साथ, यह मामला हो सकता है कि उपयोगकर्ता के पास दो ब्राउज़र विंडो खुली हैं, दोनों आपके आवेदन को इंगित करते हैं। इस मामले में आपको सत्र के दायरे के साथ थ्रेड सुरक्षा के लिए भी देखना होगा।
वाह, यह एक भरा सवाल है।
इसे सरलता से रखने के लिए, आपको यह सुनिश्चित करना होगा कि किसी भी साझा डेटा तक पहुंच ध्यान से सिंक्रनाइज़ हो। उदाहरण के लिए, आप एक म्यूटेक्स या सिंक्रनाइज़ फ़ंक्शन के साथ एक स्थैतिक चर तक पहुंच को सिंक्रनाइज़ करना चाहते हैं।
ध्यान दें कि आपको उच्च स्तर पर सिंक्रनाइज़ करने की आवश्यकता हो सकती है यदि आपको परमाणु लेनदेन की आवश्यकता होती है जो एक साथ कई साझा संसाधनों को संशोधित करता है।
एक समवर्ती आवेदन डिजाइन करना आसान नहीं है, और कोई जादू बुलेट नहीं है (दुर्भाग्य से)। सुरक्षित समवर्ती कोड लिखने के बारे में अधिक जानकारी के लिए मैं अत्यधिक "Java Concurrency in Practice" पुस्तक की अनुशंसा करता हूं।
- सर्वलेट्स के कहने चर और फिल्टर का उपयोग नहीं करते
- स्थैतिक चर का उपयोग नहीं करते
- read this article on session thread safety
- लगता
- 1. सुनिश्चित करें कि मेरा कोड थ्रेड सुरक्षित है
- 2. सी # मैं कैसे सुनिश्चित करूं कि फोकस
- 3. जावा में थ्रेड-सुरक्षित कैसे enum है?
- 4. मैं कैसे सुनिश्चित करूं कि मेरा लिनक्स प्रोग्राम कोर डंप का उत्पादन नहीं करता है?
- 5. मैं अन्य एप्लिकेशन को कैसे सूचित करूं कि मेरा एप्लिकेशन विंडोज डेस्कटॉप का हिस्सा है?
- 6. मेरा वेब एपीआई सुरक्षित बनाना?
- 7. जावा रेगेक्स थ्रेड सुरक्षित है?
- 8. जावा: थ्रेड-सुरक्षित RandomAccessFile
- 9. थ्रेड सुरक्षा सुनिश्चित करना
- 10. मैं अपने वेब एप्लिकेशन में ओपनआईडी कैसे कार्यान्वित करूं?
- 11. जावा थ्रेड-सुरक्षित में अस्थिर int है?
- 12. जावा ऑब्जेक्ट क्रमबद्धता - थ्रेड सुरक्षित?
- 13. क्या जावा 5+ में DocumentBuilderFactory थ्रेड-सुरक्षित है?
- 14. मैं थ्रेड को सुरक्षित रूप से कैसे बंद करूं?
- 15. जावा में, संग्रहकर्ताओं() थ्रेड में सुरक्षित एक तुलनात्मक है?
- 16. जावा: अपवाद वर्ग थ्रेड-सुरक्षित है?
- 17. मैं कैसे सुनिश्चित करूं कि अनुक्रम की निश्चित लंबाई हो?
- 18. मैं वेब सर्वर की छवि अपलोड निर्देशिका कैसे सुरक्षित करूं?
- 19. यह सुनिश्चित करने के लिए कि मेरा गिट रेपो कोड सुरक्षित है?
- 20. मैं rand_r का उपयोग कैसे करूं और मैं थ्रेड सुरक्षित तरीके से इसका उपयोग कैसे करूं?
- 21. मैं एएसपी.नेट एमवीसी वेब एप्लिकेशन में ऐपसेटिंग कैसे प्रदर्शित करूं?
- 22. javax.sql.DataSource थ्रेड सुरक्षित है?
- 23. पाइथन थ्रेड में + = सुरक्षित है?
- 24. जावा का टाइमज़ोन थ्रेड-सुरक्षित है?
- 25. जावा ट्रांसपोर्ट.send() क्या यह थ्रेड-सुरक्षित है?
- 26. जावा वेब एप्लिकेशन i18n
- 27. मेरा जावा स्विंग एप्लिकेशन क्लाइंट-सर्वर एप्लिकेशन कैसे बनाएं?
- 28. मेरा सुरक्षित पुनर्स्थापन कितना सुरक्षित है?
- 29. डेटा संरचना थ्रेड-सुरक्षित (जावा)
- 30. मैं थ्रेड सुरक्षित जेएसपी पेज
"वेब ऐप के जीवनकाल में एक सर्वलेट" के बारे में एक प्रश्न - मैंने सोचा कि यह एक पूल ऑब्जेक्ट था, इसलिए भार के आधार पर सर्वलेट इंजन के विवेकाधिकार पर * एक से अधिक हो सकता है। क्या यह सच नहीं है? – duffymo
केवल अगर यह लागू होता है (Servlet 2.4 के अनुसार बहिष्कृत) 'सिंगल थ्रेड मॉडेल '। – BalusC
@ बालससी: बहुत बहुत धन्यवाद सर, इस जवाब ने मुझे अंत में मदद की। मैंने अपना प्रश्न हटा दिया और अपना जवाब बढ़ा दिया। जावा में आपके जैसा कोई नहीं है। धन्यवाद एक लाख फिर से। –