You are on page 1of 16

MONITORES EN JAVA

Un monitor es un objeto que implementa acceso bajo e.m. a todos sus mtodos, y provee sincronizacin En Java, son objetos de una clase cuyos mtodos pblicos son todos synchronized Un objeto con mtodos synchronized proporciona un cerrojo nico que permite implantar monitores con comodidad y e.m. bajo control Los mtodos wait(), notify(), notifyAll() permiten sincronizar los accesos al monitor, de acuerdo a la semntica de los mismos ya conocida.

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 1

ESTUCTURA SINTCTICA DE UN MONITOR EN JAVA


class Monitor { //definir aqu datos protegidos por el monitor public Monitor(){} //constructor public synchronized tipo1 metodo1() throws InterruptedException{ notifyAll(); while(!condicion1) wait(); } public synchronized tipo2 metodo2() throws InterruptedException{ notifyAll(); while(!condicion1) wait(); }
} Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 2

SEMNTICA DEL MONITOR EN JAVA

Cuando un mtodo synchronized del monitor llama a wait() libera la e.m. sobre el monitor y encola al hilo que llam al mtodo en el wait-set. Cuando otro mtodo del monitor hace notify(), un hilo del wait-set (Java no especifica cul) pasar a la cola de hilos que esperan el cerrojo y se reanudar cuando sea planificado. Cuando otro mtodo del monitor hace notifyAll(), todos los hilos del wait-set pasarn a la cola de hilos que esperan el cerrojo y se reanudarn cuando sean planificados.

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 3

El monitor Java tiene no tiene variables de condicin, solo una cola de bloqueo de espera implcita La poltica de sealizacin es sealar y seguir (SC) El mtodo (hilo) sealador sigue su ejecucin El hilo(s) sealado(s) pasan del wait-set a la cola de procesos que esperan el cerrojo
Para dormir a un hilo a la espera de una condicin usamos el mtodo wait (dentro de un mtodo synchronized) Es menos fino que una variable de condicin El conjunto de espera para wait es nico (wait-set)
Control de la Concurrencia en Java: API Estndar 4

Antonio Tomeu

MONITORES EN JAVA: PECULIARIDADES


No es posible programar a los hilos suponiendo que recibirn la sealizacin cuando la necesiten. Al no existir variables de condicin, sino una nica variable implcita, es conveniente utilizar notifyAll para que todos los procesos comprueben la condicin que los bloque: No es posible sealizar a un hilo en especial. Por tanto: Es aconsejable bloquear a los hilos en el wait-set con una condicin de guarda en conjuncin con notifyAll(). while (!condicion) try {wait();} catch (InterruptedException e) {return;} Todos sern despertados, comprobarn la condicin y volvern a bloquearse excepto los que la encuentren verdadera (que pasan a espera del cerrojo sobre el monitor). No es aconsejable comprobar la condicin de guarda con if Los campos protegidos por el monitor suelen declararse private
Control de la Concurrencia en Java: API Estndar 5

Antonio Tomeu

Tcnica de Diseo de Monitores en Java


1. 2.

3. 4.

Decidir qu datos encapsular en el monitor. Construir un monitor terico, utilizando tantas variables de condicin como sean necesarias. Usar sealizacin SC en el monitor terico. Implementar en java
1. 2. 3. 4. 5.

Escribir un mtodo synchronized por cada procedimiento. Hacer los datos encapsulados private. Sustituir cada wait(variable_condicin) por una condicin de guarda while(!condicion) try{wait()} Sustituir cada send(variable de condicin) por una llamada a notifyAll() Escribir el cdigo de inicializacin del monitor en el constructor del mismo
Control de la Concurrencia en Java: API Estndar 6

Antonio Tomeu

/**Ejemplo de Monitor sencillo. Encapsula una variable protegida por *la abstraccion y posee una interfaz de dos metodos para *incrementarla y decrementarla y un tercero para conocer el valor *del recurso protegido. *@author Antonio Tomeu */ class Monitor { private static int Dato; //recurso protegido public Monitor(int VInic){Dato=VInic;} public synchronized void INC() { while(!(Dato<=0)) try{System.out.println("Hilo Sumador bloqueado"); wait(); } catch (InterruptedException e){} Dato++; notifyAll(); }
Antonio Tomeu Control de la Concurrencia en Java: API Estndar 7

public synchronized void DEC() { while(!(Dato>0)) try{System.out.println("Hilo Restador bloqueado"); wait(); } catch (InterruptedException e){} Dato--; notifyAll(); } public synchronized String toString() {return(new Integer(Dato).toString());} } class HiloSumador extends Thread { private Monitor Data; public HiloSumador(Monitor Ref){Data=Ref;} public void run()
{ for(;;)Data.INC(); } }
Antonio Tomeu Control de la Concurrencia en Java: API Estndar 8

class HiloRestador extends Thread { private Monitor Data; public HiloRestador(Monitor Ref){Data=Ref;} public void run() { for(;;)Data.DEC(); } } public class MonitorSimple { public static void main(String[] args) { Monitor O = new Monitor(1000); new HiloSumador(O).start(); new HiloRestador(O).start(); new HiloRestador(O).start(); new HiloRestador(O).start(); for(;;)System.out.println(O.toString()); } Control de la Concurrencia en Java: API Estndar 9 } Antonio Tomeu

MONITOR PRODUCTOR-CONSUMIDOR
/**@author Antonio Tomeu */ public class Buffer { private int numSlots = 0; private double[] buffer = null; private int putIn = 0, takeOut = 0; private int cont = 0; public Buffer(int numSlots) { this.numSlots = numSlots; buffer = new double[numSlots]; }

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 10

public synchronized void insertar (double valor) { while (cont == numSlots) //condicin de buffer try { lleno wait(); } catch (InterruptedException e) { System.err.println("wait interrumpido"); } buffer[putIn] = valor; putIn = (putIn + 1) % numSlots; cont++; notifyAll(); //insercin en e.m. }

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 11

public synchronized double extraer () { double valor; while (cont == 0) //condicin de buffer vaco try { wait(); } catch (InterruptedException e) { System.err.println("wait interrumpido"); } valor = buffer[takeOut]; takeOut = (takeOut + 1) % numSlots; cont--; notifyAll(); return valor; //extraccin en e.m. } }//Buffer

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 12

Diseo de Hilos sobre el Monitor


class Productor implements Runnable { private Buffer bb = null; public Productor (Buffer bb) {this.bb = bb;} public void run() { double item = 0.0; while (true) { bb.insertar (++item); System.out.println("Produciendo " + item); } }//run }//Productor

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 13

class Consumidor implements Runnable { private Buffer bb = null; public Consumidor (Buffer bb) {this.bb = bb; public void run() { double item; while (true) { item = bb.extraer (); System.out.println("Consumiendo " + item); } }//run }//Consumidor }

Antonio Tomeu

Control de la Concurrencia en Java: API Estndar 14

public class Prueba_Prod_Con { public static void main (String [] args) { int ranuras = 10; Buffer monitor = new Buffer (ranuras); new Thread(new Productor(monitor)).start(); new Thread(new Consumidor(monitor)).start(); }//main }//Prueba_Prod_Con
Antonio Tomeu Control de la Concurrencia en Java: API Estndar 15

EJERCICIO n Aumente el nmero de lectores y escritores, y verifique la sincronizacin n Disee un monitor en java que modele la abstraccin semforo, dtelo de mtodos wait y signal, y gurdelo en semaforo.java n Escriba ahora un protocolo de e.m. con una instancia de la clase anterior, y gurdelo en Usa_semaf.java que utilice la cuenta encapulada en el monitor n Construya un monitor que d solucin al problema de los filsofos
Antonio Tomeu Control de la Concurrencia en Java: API Estndar 16

You might also like