2013-05-08 10 views
5

मेरे पास एक प्रश्न है। मेरे आवेदन में, मेरे पास एक सर्वलेट है जिसका init कोड नीचे जैसा है।सर्वलेट इनिट विधि जिसमें सिंक्रनाइज़ ब्लॉक है

public class GameInitServlet extends HttpServlet { 

private static boolean initialized = false; 

@Override 
    public void init() throws ServletException { 
     // This is a safeguard against running init() more than once. 
     synchronized (GameInitServlet.class) { 
      if (initialized) { 

       LOG.error("GameInitServlet has already been initialized... Bailing out!"); 
       return; 
      } 
      initialized = true; 
     } 
     //some code here.... 
    } 
} 

नोट: web.xml में ऊपर सर्वलेट 1 के रूप में लोड-ऑन-स्टार्टअप चल रहा है, तो यह स्टार्टअप एप्लिकेशन के समय में प्रारंभ हो जाएगी।

इसलिए मेरा सवाल यह है कि हम इनिट विधि को सिंक्रनाइज़ क्यों कर रहे हैं। आखिरकार इसे सर्वलेट कंटेनर द्वारा ख्याल रखा जाएगा और केवल एक बार बुलाया जाएगा। क्या मैं उपरोक्त सिंक्रनाइज़ेशन प्रक्रिया को हटा सकता हूं या इसे हटाने के बाद एप्लिकेशन पर कुछ प्रभाव पड़ेगा।

+0

यह आपकी मदद कर सकता है: http://stackoverflow.com/questions/7826452/servelt-thread-pool-vs-servlet-instance-pool-by-the-web-container – Uooo

उत्तर

3

init()केवल निष्पादित किया जाएगा जब सर्वलेट प्रारंभ में कंटेनर में अपने एकल उदाहरण पर कंटेनर में लोड हो जाएगा जो कंटेनर बनायेगा। फिर doGet() और doPost() निष्पादन के अलग-अलग धागे के रूप में प्रत्येक अनुरोध के लिए विधियों को निष्पादित किया जाएगा। मुझे init() विधि या इसके अंदर कोई भी कोड सिंक्रनाइज़ करने का कोई बिंदु नहीं दिखता है। यहां तक ​​कि एक वितरित वातावरण में भी एक सर्वलेट उदाहरण प्रति JVM हो सकता है। मुझे लगता है कि कंटेनर केवल init() को सर्वलेट के जीवनकाल में कॉल करने के लिए पर्याप्त बुद्धिमान है और इसलिए init() निष्पादित करने के लिए एकाधिक धागे के बीच कोई विवाद नहीं होगा। Javadocs के अनुसार,

सर्वलेट कंटेनर सर्वलेट को तुरंत चालू करने के बाद एक बार इनिट विधि को कॉल करता है। सर्लेट को कोई अनुरोध प्राप्त करने से पहले इनिट विधि को सफलतापूर्वक पूरा करना होगा।

1

टिप्पणी के रूप में

// This is a safeguard against running init() more than once. 

यह सिर्फ दौड़ हालत किसी तरह का है, जो कभी नहीं करना चाहिए बचाने के लिए कोशिश कर रहा है कहते हैं।

किसी भी सर्वलेट, फ़िल्टर और श्रोता webapp जीवन के रूप में रूप में लंबे समय रहता है। उन्हें सभी सत्रों में सभी अनुरोधों के बीच साझा किया जा रहा है।

तो तुम कह सकते हैं कि init() विधि एक बार कहा जाता हो जाता है कंटेनर में,। तो सिंक्रनाइज़ेशन ब्लॉक करने की कोई आवश्यकता नहीं है।

लेकिन, आप कक्षा स्तर पर लॉक ले रहे हैं ऑब्जेक्ट स्तर पर, इसके लिए कोई कारण नहीं है? आपको किसी सिंक्रनाइज़ किए गए स्थिर कॉल की जांच करनी चाहिए, इस ब्लॉक को रखने का वैध कारण हो सकता है। यदि नहीं, तो आप इसे हटा सकते हैं।

आप कुछ अच्छी व्याख्या here

0

सामान्य तौर पर मैं अपने आकलन से सहमत देख सकते हैं।

यह सिंगलथ्रेडिंग को लागू नहीं कर रहा है इसलिए "सिंक्रनाइज़" को हटाने से चोट नहीं पहुंची जानी चाहिए।

दूसरी ओर यह परफॉर्मेंस का लगभग कोई नुकसान नहीं पहुंचाता है इसलिए निष्कासन पूरी तरह से "क्रूर कमी" के लिए होता है।

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