2012-03-04 8 views
25

Necesito saber por qué los servlets no son seguros para subprocesos? ¿Y cuál es la razón por la que en el servlet del controlador de estructura Struts 2.0 es seguro para subprocesos?¿Por qué los servlets no son seguros para subprocesos?

+0

que le dijo que los servlets no es seguro para subprocesos? – bmargulies

+0

@bmargulies * Yo * seguro que no los llamaría "hilos seguros", aunque me gustaría advertir que depende completamente de la implementación. La sabiduría convencional los llama no thread safe. –

+0

Relacionados: http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading – BalusC

Respuesta

35

Necesito saber por qué los servlets no son seguros para subprocesos?

casos Servlet inherentemente no es seguro para subprocesos debido a la naturaleza de múltiples roscada del lenguaje de programación Java en general. Java Virtual Machine admite la ejecución del mismo código por varios hilos. Este es un gran beneficio de rendimiento en máquinas que tienen múltiples procesadores. Esto también permite que varios usuarios simultáneos ejecuten el mismo código sin bloquearse entre sí.

Imagine un servidor con 4 procesadores en el que un servlet normal puede manejar 1000 solicitudes por segundo. Si ese servlet fuera enhebrable, entonces la aplicación web actuaría como si se ejecutara en un servidor con 1 procesador, en donde el servlet solo puede manejar 250 solicitudes por segundo (está bien, no es exactamente así, pero se entiende) .

Si encuentra problemas de seguridad de los hilos al usar servlets, entonces es su error, no es culpa de Java ni de Servlet. Debería corregir el código del servlet de tal manera que la solicitud o los datos del ámbito de la sesión sean nunca asignados como una variable de instancia del servlet. Para una explicación detallada, vea también How do servlets work? Instantiation, sessions, shared variables and multithreading.

¿Y cuál es la razón por la cual en Struts 2.0 el controlador de marco servlet es seguro para subprocesos?

No es seguro para subprocesos. Está confundiendo el distribuidor Struts servlet filtro con acciones de Struts.Las acciones de struts se vuelven a crear en cada solicitud. Por lo tanto, cada solicitud tiene su propia instancia de la acción de Struts con ámbito de solicitud. El operador Struts servlet filtro no los almacena como su propia variable de instancia. En cambio, lo almacena como un atributo del HttpServletRequest.

+3

S2 en realidad usa un filtro, no un servlet, contrario a las directrices de JEE: / –

0

El servlet no es seguro para hilos por sí solo. Puede hacerlo seguro para hilos haciendo que el método de servicio esté sincronizado. necesita implementar SingleThreadInterface para que sea seguro para subprocesos.

+0

Si un servlet no era seguro para subprocesos, ¿cómo funcionarían todas las aplicaciones web de Java sin problemas, incluso sin hacer que implementaran SingleThreadInterface? No son seguros para subprocesos si los implementa incorrectamente. Son seguros para subprocesos si los haces así. –

8

Hay una única instancia de una asignación de servlet por servlet; todas las propiedades de instancia se comparten entre todas las solicitudes. El acceso a esas propiedades debe tenerlo en cuenta.

Struts 2 acciones (no "servlet del controlador", no son ni servlets ni controladores) se instancian por solicitud. Solo se accederá a las propiedades de acción mediante un solo hilo de solicitud.

1

Los servlets son normalmente de subprocesos múltiples.

Los contenedores de servlets generalmente administran las solicitudes concurrentes mediante la creación de un nuevo subproceso de Java para cada solicitud. El nuevo subproceso recibe una referencia de objeto al servlet solicitado, que emite la respuesta a través del mismo subproceso. Esta es la razón por la cual es importante diseñar la simultaneidad cuando se escribe un servlet, porque múltiples solicitudes pueden ser manejadas por la misma instancia de servlet.

La forma en que los contenedores de servlet manejan las solicitudes de servlets depende de la implementación; pueden usar un solo servlet, pueden usar la agrupación de servlets, depende de la arquitectura del sistema del proveedor.

Struts 2 Los objetos de acción se instancian para cada solicitud, por lo que no hay problemas de seguridad de subprocesos.

1

servlet no es hilo de seguridad, pero podemos hacerlo como un hilo de seguridad mediante la aplicación de esa clase servlet a SingleThreadModel como la figura a continuación definición de clase, pero de nuevo el problema de rendimiento estará allí así que es mejor opción sería el uso porción sincronizada

public class SurveyServlet extends HttpServlet 
          implements SingleThreadModel 
{ 
servlet code here.. 
... 
} 
13

Los servlets son clases normales de Java y, por lo tanto, NO son seguros para subprocesos.

Pero dicho esto, las clases de Java son Thread safe si no tiene variables de instancia. Solo las variables de instancia necesitan sincronizarse. (Las variables de instancia son variables declaradas en la clase y no dentro de sus métodos.

Las variables declaradas en los métodos son seguras para hilos ya que cada subproceso crea su propia Pila de programas y las variables de función se asignan en la pila. unos métodos se crean para cada hilo, por lo tanto, no tiene ningún problemas de sincronización de subproceso asociado.

las variables método son seguros para subprocesos, las variables de clase no lo son.

Cuestiones relacionadas