Inicio » Informática profesional. » Programación » Curso de J2EE » Variables de instancia

Curso de J2EE

Variables de instancia

En esta sección del tema se analizan los problemas asociados al acceso concurrente a variables de instancia definidas en servlets. La conclusión a la que se llegará será que no debe trabajarse con variables de instancia que almacenen datos que puedan ser modificados por las peticiones de los clientes

Se recuerda brevemente el esquema de funcionamiento de un servidor web que integra contenedor web cuando un cliente realiza una petición a un servlet:

El contenedor web crea un objeto de la clase del servlet y, mediante ese "único" objeto se gestionan todas las peticiones de los clientes usando para cada una de ellas un hilo distinto. Las variables de instancia definidas en la clase son compartidas por todos los hilos asociados a cada petición y podría darse el caso de que varios hilos accedieran a la misma simultáneamente provocando resultados no esperados.

Posibles soluciones:

  • Hacer que en el código del servlet no haya código que implique un acceso a las variables de instancia y trabajar con variables locales definidas en los métodos de servicio doPost(..), doGet(..). De este modo, no hay problema de acceso concurrente, porque cada hilo obtiene su copia de dichas variables locales sin interferencia con las del resto de hilos asociados al resto de peticiones.
  • Definir sólo variables de instancia que almacenen valores fijos y comunes a todas las peticiones. Es la mejor.

Ejemplos: drivers de bases de datos, rutas de otros servlets que formen parte de la aplicación; en resumidas cuentas, datos fijos que comparten todas las peticiones.

Por ejemplo, drivers de BDs comunes a todas las peticiones.

  • Sincronizar los métodos de servicio. Esto es una solución horrenda que ralentizaría el acceso de los clientes a la aplicación. Hasta que no se ejecutara todo el código del método de servicio no se permitiría el acceso al mismo de otra petición.
  • Implementar la interface de marcado SingleThreadModel. En este caso, se permite al contenedor instanciar varios objetos servlet y se impide que varios hilos ejecuten simultáneamente el método de servicio de un objeto servlet. De este modo, pueden procesarse varias peticiones simultáneamente, pero mediante varios objetos servlet.

Se va a realizar un ejemplo que ilustra el problema.

Se partirá del siguiente formulario:

Para ejecutar el servlet, http://www.myjavaserver.com/servlet/trilcejf.Color

El usuario escribirá su nombre y seleccionará un color. A continuación, pulsará Enviar y los datos serán capturados por un servlet de nombre trilcejf.ServletColor. El servlet, en base a esos datos, mostrará un página html con el color de fondo introducido cuyo contenido será el nombre y dicho color. Para provocar un funcionamiento incorrecto (muestra del html respuesta con un nombre no tecleado por el usuario y un color de fondo no seleccionado), sería necesario que varios usuarios realizaran accesos simultáneos al servlet.

Se creará una aplicación web con un directorio raíz asociado de nombre Color.

Estructura de directorios:

Descriptor de despliegue web.xml:

Código fuente

Código del servlet trilcejf.ServletColor:

Código fuente

NOTA: el problema de acceso concurrente a las variables color y nombre por parte de los hilos asociados a las peticiones de clientes y los correspondientes resultados inesperados se soluciona sin más que declararlas locales en el método doGet(..)

Inscríbete ahora y accede a 3 unidades gratis

Evalua el curso de J2EE y accede a las 3 unidades gratis con acceso completo al aula virtual donde podrás disfrutar de la inestimable ayuda del tutor y una gran variedad de recursos como videotutoriales, ejercicios resueltos, foros, enlaces, bibliografía, etc....


Si desea obtener un acceso sin restricciones a los contenidos del curso de J2EE y disfrutar de todas las herramientas del aula virtual (Videos explicativos streaming, acceso a los foros, chat, ejercicios resueltos, la ayuda del tutor, audioconferencia, estudio de grabación, test y actividades de autoevaluación, etc...) puede inscribirse completamente gratis y comenzar a realizar de forma inmediata el curso.