2012-08-05 15 views
26

Leggendo un libro che diceva che la servlet è singleton dal lato del contenitore. È vero?Servlet è il singleton?

Tuttavia anche se è un singoletto, dobbiamo gestire la sincronizzazione dei dati ecc

+2

possibile duplicato di [Come funzionano le servlet? Istanziazione, variabili di sessione e multithreading] (http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading) – BalusC

+2

Un servlet non è un singleton, ma dovresti trattare come un singleton: sincronizzare o evitare gli attributi del livello di istanza. Vedi [questo] (http://stackoverflow.com/questions/6888268/httpservlet-does-not-implement-runnable-or-extend-thread-why-is-it-thread-able/6888301#6888301) pure. – home

risposta

14

No. È possibile creare un'istanza della stessa classe servlet più volte con nomi e URL di servlet diversi nello stesso contenitore Web e nella stessa app Web.

+0

Se si dispone di una sola regola di mappatura per MyServlet in web.xml e non si utilizza l'annotazione @WebServlet, posso essere sicuro che ci sarà sempre una sola istanza di MyServlet nel contenitore? –

+0

@ JimJim2000 A meno che non si eviti anche il 'SingleThreadModel': vedere l'altra risposta. – EJP

23

Guardando la definizione del pattern Singleton come definito nella Cunningham & Cunningham, Inc. Wiki

Garantire una classe ha solo un esempio, e fornire un punto di accesso globale ad esso.

Direi di no. Dal punto di vista del contenitore, un oggetto servlet viene accettato e gestito includendo la creazione di uno ServletContext, ma non impedisce che non ci sia più di un'istanza del servlet.

Per quanto riguarda tali problemi, penso che sia meglio esaminare il contratto corrispondente, che è nel caso di servlet definiti nello Java Servlet Specification. Hanno indirizzato il numero di istanze di un servlet.

2,2 Numero di istanze

La dichiarazione servlet che è o tramite l'annotazione come descritto nel capitolo 8, “Annotazioni e innestabilità” o parte del descrittore distribuzione dell'applicazione Web contenente il servlet, come descritto nel Capitolo 14, "Descrittore di distribuzione", controlla in che modo il contenitore del servlet fornisce le istanze del servlet. Per un servlet non ospitato in un ambiente distribuito (valore predefinito), il contenitore servlet deve utilizzare solo un'istanza per ogni dichiarazione servlet. Tuttavia, per un servlet che implementa l'interfaccia SingleThreadModel, il contenitore servlet può istanziare più istanze per gestire un carico pesante di richiesta e serializzare le richieste su una particolare istanza.

Nel caso in cui un servlet stato distribuito come parte di un'applicazione marcata nel descrittore di distribuzione come distribuibile, un contenitore può avere una sola istanza per dichiarazione di servlet per Java virtuale automatico (JVM ™). Tuttavia, se il servlet in un'applicazione distribuibile implementa l'interfaccia SingleThreadModel, il contenitore può creare istanze multiple di quel servlet in ciascuna JVM del contenitore .

Si specifica solo che il contenitore deve utilizzare una sola istanza (nel primo caso) e come EJP ha sottolineato nel commento:

Non c'è nulla nella specifica Servlet che impedisce a di ripetere l'istanziazione della stessa classe servlet con un nome diverso nella stessa app Web . Ergo, non un singleton.

RiferimentoJava Servlet Specification 3.0 MR (p.6-7)

+0

Ben ricercato ma non corretto. Non c'è nulla nella specifica servlet che ti impedisca di ripetere l'istanziazione della stessa classe servlet con un nome diverso nella stessa web-app. Ergo, non un singleton. – EJP

+0

@EJP Sono d'accordo con te. Dando uno sguardo alla definizione singleton non è garantita. –

-2

No, Servlet non è un Singleton. Può creare il secondo oggetto, dipende dalla richiesta in entrata e dal comportamento del contenitore.

+4

Questo non aggiunge nulla alle risposte già pubblicate da quasi 2 anni fa. –

Problemi correlati