2012-07-14 18 views
7

संभव डुप्लिकेट:
How do servlets work? Instantiation, session variables and multithreadingके बारे में धागा सुरक्षा

सर्वलेट है धागा सुरक्षित है ..? पूर्व के लिए अगर मैं 5 अलग-अलग ब्राउज़र खोलने के लिए और कंटेनर में एक सर्वलेट करने का अनुरोध भेजा, यह अभी भी सुरक्षित थ्रेड है, मैं service() विधि का मतलब है विशेष रूप से

उत्तर

22

आपका प्रश्न करने पर निर्भर करता: पर एक से अधिक थ्रेड से कोई विधि बुला रहा है एक ही वस्तु धागा सुरक्षित है। और जवाब है: यह पर निर्भर करता है। यदि आपकी ऑब्जेक्ट (इसे सर्वलेट होने दें) स्टेटलेस है या केवल final फ़ील्ड हैं, तो यह पूरी तरह से थ्रेड सुरक्षित है। स्थानीय चर और पैरामीटर धागे के लिए स्थानीय हैं (ढेर पर नहीं, ढेर पर नहीं)।

प्रत्येक service() कॉल ServletRequest और ServletResponse का विशिष्ट उदाहरण प्राप्त करता है। हालांकि यहां असुरक्षित सर्वलेट का एक उदाहरण है:

public class UnsafeServlet implements Servlet { 

    private int counter; 

    public void init(ServletConfig config) throws ServletException { 
    } 

    public void service(ServletRequest request, ServletResponse response) 
     ++counter; 
    } 

    public void destroy() { 
    } 

} 

से अधिक थ्रेड के बाद से counter चर का उपयोग कर सकते हैं, यह किसी भी तरह सुरक्षित हो गया है: या तो synchronized का उपयोग करके (volatile पर्याप्त नहीं है):

synchronized(this) { 
    ++counter; 
} 

या AtomicInteger:

private AtomicInteger counter = new AtomicInteger(); 

//... 
counter.incrementAndGet(); 

इस विशेष मामले AtomicInteger में काफी बेहतर sinc है ई यह सीएएस सीपीयू ऑपरेशंस का उपयोग कर लॉक-फ्री है जबकि synchronized एक म्यूटेक्स है।

+0

@ Tomasz.can आप यहां एक छोटा सा उदाहरण पोस्ट करते हैं जिसके द्वारा आप औचित्य साबित कर सकते हैं कि आपके पास एक सरल सर्वलेट है और 2 अलग-अलग ब्राउज़रों के साथ आप अनुरोध कर रहे हैं और एक थ्रेड द्वारा जानबूझ कर मूल्य बदलते हैं। यह बात मैं देखना चाहता हूं .. !! अग्रिम धन्यवाद – user1508454

+0

ग्रेट मैन, क्या आप कृपया पोस्ट कर सकते हैं कि आप अब काउंटर की रक्षा कैसे करेंगे, और सिंक्रनाइज़ किए जाने से यह प्रदर्शन पर प्रभाव डालेगा, क्या आप परमाणु इंटीजर के बारे में कुछ भी बता सकते हैं – user1508454

+0

@ user1508454: मेरे अपडेट देखें –