आपका प्रश्न करने पर निर्भर करता: पर एक से अधिक थ्रेड से कोई विधि बुला रहा है एक ही वस्तु धागा सुरक्षित है। और जवाब है: यह पर निर्भर करता है। यदि आपकी ऑब्जेक्ट (इसे सर्वलेट होने दें) स्टेटलेस है या केवल 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
एक म्यूटेक्स है।
स्रोत
2012-07-14 16:47:17
@ Tomasz.can आप यहां एक छोटा सा उदाहरण पोस्ट करते हैं जिसके द्वारा आप औचित्य साबित कर सकते हैं कि आपके पास एक सरल सर्वलेट है और 2 अलग-अलग ब्राउज़रों के साथ आप अनुरोध कर रहे हैं और एक थ्रेड द्वारा जानबूझ कर मूल्य बदलते हैं। यह बात मैं देखना चाहता हूं .. !! अग्रिम धन्यवाद – user1508454
ग्रेट मैन, क्या आप कृपया पोस्ट कर सकते हैं कि आप अब काउंटर की रक्षा कैसे करेंगे, और सिंक्रनाइज़ किए जाने से यह प्रदर्शन पर प्रभाव डालेगा, क्या आप परमाणु इंटीजर के बारे में कुछ भी बता सकते हैं – user1508454
@ user1508454: मेरे अपडेट देखें –