2010-02-10 11 views
14

मैं कैसे सुनिश्चित करूं कि मेरे जावा सर्वलेट वेब एप्लिकेशन थ्रेड सुरक्षित है? सत्र चर, कक्षा के स्थैतिक चर, या किसी अन्य चीज के संबंध में मुझे थ्रेड-सुरक्षा समस्या के संबंध में क्या करने की आवश्यकता है?जावा में, मैं कैसे सुनिश्चित करूं कि मेरा वेब एप्लिकेशन थ्रेड सुरक्षित है?

उत्तर

21

तथ्य: वहाँ वेब ऐप्लिकेशन की में है एक सर्वलेट का केवल 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 भी देखें। आपको बस यह सुनिश्चित करने की ज़रूरत है कि आप शुद्ध अनुरोध नहीं करते- या एप्लिकेशन स्कोप में सत्र स्कॉप्ड डेटा नहीं डालते हैं।

+0

"वेब ऐप के जीवनकाल में एक सर्वलेट" के बारे में एक प्रश्न - मैंने सोचा कि यह एक पूल ऑब्जेक्ट था, इसलिए भार के आधार पर सर्वलेट इंजन के विवेकाधिकार पर * एक से अधिक हो सकता है। क्या यह सच नहीं है? – duffymo

+0

केवल अगर यह लागू होता है (Servlet 2.4 के अनुसार बहिष्कृत) 'सिंगल थ्रेड मॉडेल '। – BalusC

+0

@ बालससी: बहुत बहुत धन्यवाद सर, इस जवाब ने मुझे अंत में मदद की। मैंने अपना प्रश्न हटा दिया और अपना जवाब बढ़ा दिया। जावा में आपके जैसा कोई नहीं है। धन्यवाद एक लाख फिर से। –

0

क्या आप किसी अन्य जावा एप्लिकेशन के विरोध में संदर्भ में हैं? वास्तव में बहुत अंतर नहीं है। सर्वलेट के लिए प्रत्येक अनुरोध कंटेनर को इसे संभालने के लिए एक नया धागा जारी करने का कारण बनता है, इसलिए सर्वलेट के भीतर आवृत्ति चर थ्रेड-सुरक्षित होना चाहिए। DoGet/doPost() विधियों में स्थानीय चर के साथ अपने सभी बिज़ को संभालना बेहतर है। एक गोचाचा है जिसे मैं सोच सकता हूं। सत्र चर के साथ, यह मामला हो सकता है कि उपयोगकर्ता के पास दो ब्राउज़र विंडो खुली हैं, दोनों आपके आवेदन को इंगित करते हैं। इस मामले में आपको सत्र के दायरे के साथ थ्रेड सुरक्षा के लिए भी देखना होगा।

1

वाह, यह एक भरा सवाल है।

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

ध्यान दें कि आपको उच्च स्तर पर सिंक्रनाइज़ करने की आवश्यकता हो सकती है यदि आपको परमाणु लेनदेन की आवश्यकता होती है जो एक साथ कई साझा संसाधनों को संशोधित करता है।

एक समवर्ती आवेदन डिजाइन करना आसान नहीं है, और कोई जादू बुलेट नहीं है (दुर्भाग्य से)। सुरक्षित समवर्ती कोड लिखने के बारे में अधिक जानकारी के लिए मैं अत्यधिक "Java Concurrency in Practice" पुस्तक की अनुशंसा करता हूं।

16
  • सर्वलेट्स के कहने चर और फिल्टर का उपयोग नहीं करते
  • स्थैतिक चर का उपयोग नहीं करते
  • read this article on session thread safety
  • लगता
+2

मुझे लगता है कि आइटम 4 बहुत अधिक सुपरसीड (कवर) 1-3। :) –

+3

अच्छी तरह से, कुछ बुनियादी जानकारी की आवश्यकता है इससे पहले कि आप कुछ अच्छी सोच – Bozho

+0

+1 आइटम के लिए +1 कर सकते हैं :) – BalusC

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