Thread Safety y los Servlets
Como Uds. saben, los servlets se ejecutan en un entorno multihilo (=multihebra), por lo que tenemos que tener mucho cuidado a la hora de escribir código en ellos. Se dice que el código que se escriba en un servlet debe ser "Thread Safe". No voy a detallar en forma exhaustiva todos los requisitos para que sea "Thread Safe", pueden ver un artículo interesante en wikipedia.
Quiero hacer incapié en uno sólo:
Lo cierto es que el heap es compartido por todos los hilos de ejecución y sólo los parámetros de los métodos y variables de ese ámbito son exclusivas del hilo. Entonces, el declarar atributos en la clase Servlet, hará que esos atributos sean compartidos por todos los hilos de ejecución (recuerden que cada hilo representa la interacción con un usuario vía Internet/LAN), entonces se vuelve muy peligroso este tipo de prácticas.
La mejor recomendación que puedo hacerles es que no declaren atributos, ni se les ocurra poner synchronized en doPost/doGet y declaren siempre todas las variables locales al método.
Saludos, PF
4 Comments:
Hola, esta bien eso de tus advertencias sobre variables en servlet y la forma de hacer un codigo thread-safe, pero discrepo en la afirmación de no usar bloques sinchronize dentro del get/post. Mira este tutorial en el que te dice que el objeto session y servletcontext son recursos compartidos, y se deberían proteger.
Concurrencia y serlvet
Antonio:
Gracias por tu aclaración, efectivamente es algo que me faltó mencionar.
El marcar al método entero como synchronized genera baja performance,
pero no quise decir que no tuvieramos bloques synchronized dentro. Esta aclaración
también se encuentra en el libro "Servlets And JSP" de Jason Falkner.
Gracias por colaborar.
Los metodos sessión y request son de ambito de usuario. A menos que tengas una pagina con varios frames tirando concurrentemente del mismo servlet no es necesario sincronizar estos 2 objetos.
Publicar un comentario
<< Home