Next: Interfaz segura para multi-hilos
Up: Patrones de diseño para
Previous: Aceptor-Conector
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 regiones críticas
Comportamiento exigido:
- se quiere que un proceso/hilo queda bloqueado si otro proceso/hilo
ya ha entrado en la región crítica, es decir, ha obtenido la
llave exclusiva de dicha región
- se quiere que independientemente del método usado para salir de la
región crítica (p.ej. uso de return, break etc.)
se devuelve la llave exclusiva para la región
Posible solución:
- se inicializa la regió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 regió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 región crítica,
el compiler 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 asi cambiado se llama a veces:
strategized locking)
Next: Interfaz segura para multi-hilos
Up: Patrones de diseño para
Previous: Aceptor-Conector
© 2003, Dr. Arno Formella, Universidad de Vigo, Departamento de Informática