2012-04-21 7 views
5

Cuando leo Head First Servlet and JSP, dicen que la variable de instancia no es segura para subprocesos.Por qué la variable de instancia en Servlet no es segura para subprocesos

No entiendo tanto esta afirmación. Por ejemplo: tengo un servlet cuyo nombre es ActionServlet.java. Cada vez, la solicitud de cada usuario se envía al servidor, el contenedor creará un nuevo hilo y creará una nueva instancia de ActionServlet.

ActionServlet puede ser tiene una estructura:

public class ActionServlet extends HttpServlet { 
    // example of instance variable 
    Instance variable; 
    public void processRequest(HttpServletRequest request, HttpServletResponse response) { 
     // process something relating to instance variable 
    } 
} 

Por lo tanto, debido a que todos estos hilos de crear una nueva instancia de la clase de ActionServlet, por lo que no ven ningún problema aquí. porque las instancias de estos hilos están separadas la una de la otra.

Determine dónde se produce un problema cuando se usa la variable de instancia en el entorno de multiproceso.

Gracias :)

+3

Considere llamar al mismo método en el mismo objeto desde dos subprocesos. –

+0

@DanielFischer No me puedo imaginar cómo diferentes hilos pueden usar el mismo objeto porque: 1) estas variables son privadas 2) El objeto de este hilo siempre es diferente de otro hilo (creo). Tengo un código de muestra arriba. Por favor dime más claro. – hqt

+2

@hqt: el contenedor crea una instancia única del servlet, la almacena en alguna estructura de datos global (un mapa, por ejemplo) y cada vez que recibe una solicitud, obtiene el servlet apropiado (según la ruta de la solicitud) del mapa, y llama a su método de servicio. El hecho de que los campos del servlet sean privados no tiene ninguna influencia. El contenedor ni siquiera se preocupa por ellos. –

Respuesta

14

El error que está haciendo está aquí:

Por lo tanto, debido a que todos estos hilos de crear una nueva instancia de la clase de ActionServlet, por lo que no ven ningún problema aquí. porque las instancias de estos hilos están separados unos de otros.

El contenedor no crea una nueva instancia de la clase Servlet para cada solicitud. Reutiliza uno existente. Es por eso que no son seguros para subprocesos.

El marco de acción de Stripes DOES crea una nueva instancia para cada solicitud, por lo que es una suposición correcta en ese marco. Sin embargo, por ejemplo, Struts 1 sigue el modelo de Servlet y no crea una nueva acción por solicitud.

Eso no quiere decir que el contenedor esté limitado a una sola instancia, en teoría puede crear más de uno, pero no es un comportamiento específico, por lo que no se puede confiar en él. La mayoría de los populares no.

+3

De hecho, el contenedor DEBE crear solo una instancia. Esto es lo que dice la especificación: "Para un servlet no alojado en un entorno distribuido (el predeterminado), el contenedor servlet debe usar solo una instancia por declaración de servlet" –

+0

Oh. Gracias por ambos @JBNizet y Will Hartung. este libro no me muestra ese contenedor SÓLO crea una instancia para un servlet. – hqt

0

Lo que pasa es que su action.java no se instancia siempre pero está siendo tomado de una piscina instancia, lo mismo pasa con los hilos de solicitud, que se ha tomado de un grupo de subprocesos , entonces una instancia de servlet puede ser compartida por múltiples solicitudes.

+4

No hay un grupo de instancias para el servlet. Solo hay una instancia de servlet por declaración de servlet. –

2

porque todos estos hilos de crear una nueva instancia de la clase (action.java), por lo que no veo ningún problema

Usted está suponiendo que cada hilo de crear una instancia de la clase que se utilizará únicamente por ese hilo, es por eso que no tienes ningún problema.

Pero trate de imaginar, con su muestra específica, que se accede a la misma instancia desde dos hilos. ¿Qué pasará si ambos utilizan en el mismo tiempo sus miembros request y response? Tal vez leerá datos de una solicitud no identificable y escribirá una respuesta inconsistente que mezcla dos partes.

Por lo tanto, en su caso, la variable de instancia no es segura para subprocesos, ya que si dos subprocesos tienen acceso a la misma instancia, pueden molestarse mutuamente.

Cuestiones relacionadas