jueves, octubre 19, 2006

Thread Safety y los Servlets

Ok, hay un documento de la serie "Aprenda informática como si estuviera en primero", se llama "Servlets de Java", no está tan mal, bastante básico, pero siempre he pensado que para programar en Java de forma más o menos decente, se requiere una buena base. Es como si fuera una pirámide, si la base es la parte ancha, forma una buena estructura, si está al revés, es bastante peligroso e inestable. Por lo menos pensando de esta manera trato de dictar mis cursos.


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:


NO SE DECLARAN ARTIBUTOS EN LOS SERVLETS A MENOS QUE ESTEMOS MUY SEGUROS DE LO QUE ESTAMOS HACIENDO

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:

At 8:43 a. m., Blogger Antonio Mª said...

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.

 
At 8:44 a. m., Blogger Antonio Mª said...

Concurrencia y serlvet

 
At 1:16 a. m., Blogger Pablo Frias said...

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.

 
At 5:56 a. m., Anonymous Anónimo said...

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