2013-05-08 12 views
5

Ho una domanda. Nella mia applicazione, ho un servlet il cui codice di inizializzazione è il seguente.Metodo inizial servlet con blocco sincronizzato

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.... 
    } 
} 

NOTA: In web.xml quanto sopra servlet sta avendo load-on-startup come 1, in modo da otterrà inizializzato al momento della messa in servizio l'applicazione.

quindi la mia domanda è perché stiamo sincronizzando il metodo init. Dopotutto sarà curato dal servlet container e verrà chiamato una sola volta. Posso rimuovere il processo di sincronizzazione sopra o ci sarà un certo impatto sull'applicazione dopo aver rimosso questo.

+0

Questo potrebbe aiutarti: http://stackoverflow.com/questions/7826452/servelt-thread-pool-vs-servlet-instance-pool-by-the-web-container – Uooo

risposta

3

init() sarà eseguito solo una volta quando il Servlet viene inizialmente caricato nel contenitore sulla sua singola istanza che verrà creato dal Contenitore. Quindi i metodi doGet() e doPost() verranno eseguiti per ogni richiesta come thread di esecuzione separati. Non vedo alcun punto di sincronizzazione del metodo init() o di alcun codice al suo interno. Anche in un ambiente distribuito può esserci un'istanza Servlet per JVM. Penso che il Contenitore sia abbastanza saggio da chiamare init() una sola volta nel corso della vita del servlet e quindi non ci sarà alcuna contesa tra più thread da eseguire init(). Come da Javadocs,

Il contenitore servlet chiama il metodo init esattamente una volta dopo l'istanziazione del servlet. Il metodo init deve essere completato correttamente prima che il servlet possa ricevere qualsiasi richiesta.

1

Come il commento dice

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

Questo è solo cercando di salvare una sorta di gara-condizione, che non dovrebbe mai accadere.

Qualsiasi servlet, filtro e listener dura finché dura la webapp. Sono condivisi tra tutte le richieste in tutte le sessioni.

Quindi si può dire che il metodo init() viene chiamato una volta, nel contenitore. Quindi non c'è bisogno di avere un blocco di sincronizzazione.

Ma, si sta prendendo il blocco a livello di classe non a livello di oggetto, per qualsiasi motivo per lo stesso? Dovresti controllare eventuali chiamate statiche sincronizzate, ci può essere una ragione valida per avere questo blocco. Se no, puoi rimuovere lo stesso.

si possono vedere alcune buona spiegazione here

0

In generale Sono d'accordo con la vostra valutazione.

Non sembra che si stia implementando il singlethreading, quindi rimuovere "il sicronizzato" non dovrebbe far male.

D'altra parte non causa quasi nessuna perdita di perfomance, quindi la rimozione è solo per "riduzione del cruft".

Problemi correlati