Monitores
Juan José Ruiz Ferrer
Gianfranco Yorio Álva
Francisco Javier Martínez de la Vega
Monitores
• Antecedentes
• Definición
• Wait
• Signal
• Tipos de Señalizacion
• Monitores en Java
• Ejemplos
Antecedentes
• Definido por primera vez en 1974 por, el
científico en computación, Sir Charles Anthony
Richard Hoare.
• Implementado en Varios Lenguajes de
programación como Pascal concurrente,
Modula-2, Modula-3 y Java
Definición
• Objetos usados por más de un Hilo de
ejecución .
• Permite diseñar accesos a recursos de forma
coordinada
Wait y Signal
• Wait.- Suspende la ejecución del proceso que
esta llamando la condición, permitiendo que
otro proceso pueda ingresar.
• Signal.- Reanuda la ejecución de algún proceso
suspendido con wait (con la misma condicion),
con varios procesos escoge uno, si no hay
procesos no hace nada y desaparece.
Tipos de señalizacion
• Ejemplo productor/consumidor
• Identificar condiciones de espera y señalización
Productor necesita esperar si buffer está lleno
– Productor debe señalizar a consumidor después de ingresar un
elemento (consumidor puede estar esperando por uno buffer estaba
vacío)
– Consumidor necesita esperar si buffer está vacío
– Consumidor debe señalizar a productor después de sacar un elemento
de buffer (productor puede estar esperando por posición vacía)
– Variables de condición. Not_empty y not_full.
• Productor espera por condición not_full y señaliza condición
not_empty despues de ingresar un elemento.
• Consumidor espera por condición not_empty y señaliza condición
not_full, despues de sacar un elemento
Monitores en Java
• Wait() le dice al hilo que suspenda actividad
hasta que entre otro hilo al monitor llamando
a “notify()”.
• Notify() despierta al PRIMER hilo que duerme
“wait()” en un mismo objeto.
• NotifyAll() despierta a todos los hilos llamados
por Wait()
Ejemplo
class Q { class Producer implements Runnable {
int n; Q q;
boolean valueSet = false; Producer(Q q) {
synchronized int get() { this.q = q;
if(!valueSet) new Thread(this, "Producer").start();
try { }
wait(); public void run() {
} catch(InterruptedException e) { int i = 0;
while(true) {
[Link]("InterruptedExceptio [Link](i++);
n caught"); }
} }
[Link]("Got: " + n); }
valueSet = false; class Consumer implements Runnable {
notify(); Q q;
return n; Consumer(Q q) {
} this.q = q;
synchronized void put(int n) { new Thread(this, "Consumer").start();
if(valueSet) }
try { public void run() {
wait(); while(true) {
} catch(InterruptedException e) { [Link]();