Quando si legge Head First Servlet and JSP
, si dice che la variabile di istanza è non thread-safe.Perché la variabile di istanza in Servlet non è thread-safe
Non capisco questa affermazione così tanto. Ad esempio: ho un servlet il cui nome è ActionServlet.java
. Ogni volta, ogni richiesta dell'utente viene inviata al server, il contenitore crea una nuova discussione e crea una nuova istanza ActionServlet
.
ActionServlet
può essere ha una struttura:
public class ActionServlet extends HttpServlet {
// example of instance variable
Instance variable;
public void processRequest(HttpServletRequest request, HttpServletResponse response) {
// process something relating to instance variable
}
}
Quindi, perché tutti questi fili creano una nuova istanza della classe per ActionServlet
, quindi non vedo alcun problema qui. perché le istanze di questi thread sono separate l'una dall'altra.
Si prega di capire dove si trova il problema quando si usa la variabile di istanza nell'ambiente multithread.
Grazie :)
Pensa a chiamare lo stesso metodo sullo stesso oggetto da due thread. –
@DanielFischer Non riesco a immaginare come un thread differente possa utilizzare lo stesso oggetto perché: 1) queste variabili sono private 2) Oggetto di questo thread sempre diverso dall'altro thread (penso). Ho un codice di esempio sopra. Per favore dimmi più chiaro. – hqt
@hqt: il contenitore crea un'istanza univoca del servlet, lo memorizza in una struttura di dati globale (una mappa per esempio) e ogni volta che arriva una richiesta, ottiene il servlet appropriato (basato sul percorso della richiesta) dalla mappa e chiama il suo metodo di servizio. Il fatto che i campi della servlet siano privati non ha alcuna influenza. Il contenitore non si preoccupa nemmeno di loro. –