Next: Interfaz segura para multi-hilos
Up: Patrones de diseño para
Previous: Aceptor-Conector
  Índice General
El patrón guard es conocido también
como scoped locking, synchronized block o
execute-around-object.
Se usa cuando una aplicación
- contiene procesos (hilos) que se ejecutan concurrentemente y
- hay que proteger bloques de código con un punto de
entrada pero varios puntos de salida
- para que no entren varios hilos a la vez.
Ejemplos:
- cualquier tipo de protección de secciones críticas
Comportamiento exigido:
- se quiere que un proceso queda bloqueado si otro proceso
ya ha entrado en la sección crítica, es decir, ha obtenido la
llave exclusiva de dicha sección
- se quiere que independientemente del método usado para salir de la
sección crítica (por ejemplo uso de return, break etc.)
se devuelve la llave exclusiva para la región
Posible solución:
- se inicializa la sección crítica con un objeto de guardia
que intenta obtener una llave exclusiva
- se aprovecha de la llamada automática de destructores para
librar la sección crítica, es decir, devolver la llave
Detalles de la implementación:
- Java proporciona el guardián directamente en el lenguaje:
métodos y bloques sincronizados (synchronized)
- hay que prevenir auto-bloqueo en caso de llamadas recursivas
- hay que tener cuidado con interrupciones forzadas que circundan
el flujo de control normal
- porque el guardián no está usado en la sección crítica,
el compilador puede efectuar ciertos mensajes de alerta y -- en el caso
peor -- un optimizador puede llegar a tal extremo eliminando el objeto
- para facilitar la implementación de un guardián en diferentes
entornos (incluyendo situaciones secuenciales donde el guardián
efectivamente no hace nada) se puede aprovechar de estrategias de
polimorfismo o de codificación con plantillas para flexibilizar
el guardián (el patrón así cambiado se llama a veces:
strategized locking)
Next: Interfaz segura para multi-hilos
Up: Patrones de diseño para
Previous: Aceptor-Conector
  Índice General
© 2005, Dr. Arno Formella, Universidad de Vigo, Departamento de Informática