Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002 Corsi A e B Esercitazioni 7 e 8 Bounded Buffer con sincronizzazione Java (1) public class BoundedBuffer private int buffer[]; private int in=0, out=0, count=0, dim; public BoundedBuffer (int dim) this.dim=dim; buffer=new int[dim]; public synchronized int get () /* lucidi seguenti */ public synchronized void put (int item) /* lucidi seguenti */
Bounded Buffer con sincronizzazione Java (2) public synchronized int get () while (count==0) try wait(); catch (InterruptedException e) int item = buffer[out]; out=(out+1)%dim; count--; notifyall(); return item; Bounded Buffer con sincronizzazione Java (3) public synchronized void put (int item) while (count==dim) try wait(); catch (InterruptedException e) buffer[in] = item; in=(in+1)%dim; count++; notifyall();
Bounded Buffer con sincronizzazione Java (4) public class Consumer extends Thread private BoundedBuffer buffer; private int id; public Consumer (BoundedBuffer buffer, int id) this.buffer = buffer; this.id = id; public void run () for (int i=0; i<10; i++) int value = buffer.get(); System.out.println ("Consumer #"+id+" ha estratto "+value); Bounded Buffer con sincronizzazione Java (5) public class Producer extends Thread private BoundedBuffer buffer; private int id; public Producer (BoundedBuffer buffer, int id) this.buffer = buffer; this.id = id; public void run () for (int i=0; i<10; i++) buffer.put(i); System.out.println ("Producer #"+id+" ha inserito "+i);
Bounded Buffer con sincronizzazione Java (6) public class BBTest public static void main (String args[]) BoundedBuffer bb = new BoundedBuffer (10); Producer pv[] = new Producer [5]; for (int i = 0; i < 5; i++) pv[i] = new Producer (bb,i); pv[i].start(); Consumer cv[] = new Consumer [9]; for (int i = 0; i < 9; i++) cv[i] = new Consumer (bb,i); cv[i].start(); Lettori-Scrittori con sincronizzazione Java (1) public class Database private int readercount; private boolean dbreading; private boolean dbwriting; public Database() readercount = 0; dbreading = false; dbwriting = false; public synchronized int startread() /* lucidi seguenti */ public synchronized int endread() /* lucidi seguenti */ public synchronized void startwrite() /* lucidi seguenti */ public synchronized void endwrite() /* lucidi seguenti */
Lettori-Scrittori con sincronizzazione Java (2) public synchronized int startread() while (dbwriting == true) try wait(); catch (InterruptedException e) ++readercount; if (readercount == 1) dbreading = true; return readercount; Lettori-Scrittori con sincronizzazione Java (3) public synchronized int endread() --readercount; if (readercount == 0) dbreading=false; notifyall(); return readercount;
Lettori-Scrittori con sincronizzazione Java (4) public synchronized void startwrite() while (dbreading == true dbwriting == true) try wait(); catch (InterruptedException e) dbwriting = true; public synchronized void endwrite() dbwriting = false; notifyall(); Blocchi sincronizzati (1) Anche blocchi di codice, oltre che interi metodi, possono essere dichiarati synchronized. Ciò consente di associare un lock la cui durata è tipicamente inferiore a quella di un intero metodo synchronized.
Blocchi sincronizzati (2) public void syncronized F() // sezione non critica (p.es.: inizializzazione di variabili locali) // sezione critica // sezione non critica public void F() // sezione non critica synchronized (this) // sezione critica // sezione non critica Semafori in Java (1) Java non fornisce semafori, ma una classe semaforo può essere costruita usando i meccanismi di sincronizzazione di Java.
public class Semaphore Semafori in Java (2) private int value; public Semaphore() value = 0; public Semaphore(int v) value = v; public synchronized void P () /* lucidi seguenti */ public synchronized void V () /* lucidi seguenti */ Semafori in Java (3) public synchronized void P () if (--value < 0) try wait(); catch (InterruptedException e)
Semafori in Java (4) public synchronized void V () if (++value <= 0) notify (); Lettori-Scrittori con semafori Java (1) public class Reader extends Thread private Database server; public Reader (Database db) server = db; public void run () int c; while (true) c = server.startread(); /* lettura dal database */ c = server.endread();
Lettori-Scrittori con semafori Java (2) public class Writer extends Thread private Database server; public Writer (Database db) server = db; public void run () while (true) server.startwrite(); /* scrittura sul database */ server.endwrite(); Lettori-Scrittori con semafori Java (3) public class Database private int readercount; // numero di lettori attivi private Semaphore mutex; // per l accesso a readercount private Semaphore db; // per l accesso al database public Database () readercount = 0; mutex = new Semaphore(1); db = new Semaphore(1); public int startread() /* lucidi seguenti */ public int endread() /* lucidi seguenti */ public void startwrite() /* lucidi seguenti */ public void endwrite() /* lucidi seguenti */
Lettori-Scrittori con semafori Java (4) public int startread () mutex.p(); ++readercount; if (readercount == 1) db.p(); mutex.v(); return readercount; Lettori-Scrittori con semafori Java (5) public int endread() mutex.p(); --readercount; if (readercount == 0) db.v(); mutex.v(); return readercount;
Lettori-Scrittori con semafori Java (6) public void startwrite() db.p(); public void endwrite() db.v(); Cinque Filosofi con semafori Java (1) public class Filosofo extends Thread private int id; private Semaphore destro, sinistro; public Filosofo (int id, Semaforo dx, Semaforo sx) this.id=id; destro=dx; sinistro=sx; public void run () while (true) /* pensa */ destra.p(); sinistra.p(); /* mangia */ destra.v(); sinistra.v();
Cinque Filosofi con semafori Java (2) public class CinqueFilosofi public static void main (String args[]) Semaphore sv[] = new Semaphore[5]; for (int i=0; i < 5; i++) sv[i]=new Semaphore(1); Filosofo fv[] = new Filosofo[5]; for (int i=0; i < 5; i++) fv[i]=new Filosofo(i,sv[(i+4)%5], sv[(i+1)%5]); for (int i=0; i < 5; i++) fv[i].start();