Next: Mitad-síncrono, mitad-asíncrono
Up: Patrones de diseño para
Previous: Objetos activos
  Índice General
El patrón monitor object es conocido también
como thread-safe passive object.
Se usa cuando una aplicación
- consiste en varios hilos
- que actuan sobre el mismo objeto de modo concurrente
Ejemplos:
- colas de pedido y colas de espera en un restaurante tipo comida
rápida
Comportamiento exigido:
- se protege los objetos así que cada hilo accediendo el objeto
vea el estado apropiado del objeto para realizar su acción
- se quiere evitar llamadas explícitas a semáforos
- se quiere facilitar la posibilidad que un hilo bloqueado deje el
acceso exclusivo al objeto para que otros hilos puedan tomar el
mando (aún el hilo queda a la espera de re-tomar el objeto de nuevo)
- si un hilo suelta temporalmente el objeto, este debe estar en un
estado adecuado para su uso en otros hilos
Posible solución:
- se permite el acceso al objeto solamente con métodos sincronizados
- dichos métodos sincronizados aprovechan de una sola llave (llave del
monitor) para encadenar todos los accesos
- un hilo que ya ha obtenido la llave del monitor puede acceder libremente
los demás métodos
- un hilo reestablece en caso que puede soltar el objeto un estado
de la invariante del objeto y se adjunta en una cola de espera para
obtener acceso de nuevo
- el monitor mantiene un conjunto de condiciones que deciden los casos
en los cuales se puede soltar el objeto (o reanuar el trabajo para
un hilo esperando)
Detalles de la implementación:
- los objetos de Java implícitamente usan un monitor para administrar
las llamadas a métodos sincronizados
- hay que tener mucho cuidado durante la implementación de los
estados invariantes que permiten soltar el monitor temporalmente
a la reanuación del trabajo cuando se ha cumplido la condición
necesaria
- hay que prevenir el posible bloqueo que se da por llamadas intercaladas
a monitores de diferentes objetos: se suelta solamente el objeto
de más alto nivel y el hilo se queda esperando en la cola de espera
(un fallo común en Java)
Next: Mitad-síncrono, mitad-asíncrono
Up: Patrones de diseño para
Previous: Objetos activos
  Índice General
© 2005, Dr. Arno Formella, Universidad de Vigo, Departamento de Informática