La pregunta SCWCD del día - Servlets y Threads

(Imagen; Pancho Fierro - Seminarista persiguiendo a un perro)

Una pregunta curiosa tipo SCWCD. A ver si le atinan (como siempre, pregunta en inglés):
  • ¿What is the recommended way to deal with servlets and thread safety?
    • Write the servlet code to extend ThreadSafeServlet
    • Have the servlet implement SingleThreadModel
    • Log all servlet method calls
    • Use local variables exclusively , and if you have to use instance variables, synchronize access to them.
Empecemos por ThreadSafeServlet, que no existe en el API Servlet (esa es una para despistar ... suena correcto, no?). SingleThreadModel fue mandada al olvido (deprecated) en la versión 2.4 del API Servlet, y de implementarla no soluciona el problema sino más bien nos genera un sinnúmero de problemas más... que ameritan otro post (Resumiendo:SingleThreadModel no sirve y no debe usarse ). Mantener logs de los métodos nos llena nuestra consola, pero aun así tenemos nuestro problema de threads, dado que siempre se mantiene una instancia del servlet y a cada request accede a la misma mediante un thread. Entonces, si un thread modifica una variable de instancia, el otro thread va a ver el cambio, y puede cambiarla de nuevo...y toda la integridad de la aplicación se va al tacho.

Por eso, la solución es trabajar siempre con variables locales, es decir, variables de método. Estas variables sólamente existen durante la ejecución del método y cada thread tiene su propio juego de variables locales, por lo que se puede decir que son thread-safe. Ahora, si es muy necesario usar variables de instancia (atributos), pues no te queda otra que sincronizar su acceso (synchronized..recuerdas del SCJP?) y que cada thread espera su turno para modificar o leer su valor.

Entonces...la respuesta es la última.

Pregunta tomada de Head First in Servlets & JSP.



Publicar un comentario