Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)



Documenti analoghi
Concetto di processo

Java Virtual Machine

Java threads (2) Programmazione Concorrente

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Sincronizzazione con Java

Esercitazione 15. Il problema dello Sleeping Barber

Un esercizio d esame. Flavio De Paoli

Java RMI: Esempio Completo di un Applicazione Distribuita

SISTEMI OPERATIVI. Sincronizzazione in Java (Semafori e barriere) Patrizia Scandurra (MODULO DI INFORMATICA II) LABORATORIO

Algoritmi di Ricerca. Esempi di programmi Java

Programmazione concorrente in Java

SISTEMI OPERATIVI. Sincronizzazione in Java (Monitor e variabili condizione in Java)

Algoritmo di Dekker. Algoritmo di Peterson

Esercizi sugli Oggetti Monitor

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Esercizi sul Monitor in Java

SAPIENZA Università di Roma, Facoltà di Ingegneria

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Multithreading in Java. Fondamenti di Sistemi Informativi

Ottava Esercitazione. introduzione ai thread java mutua esclusione

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

progam ponteasensounicoalaternato ; type dir = ( nord, sud );

Il costrutto monitor

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Sincronizzazione dei Thread in Java. Daniela Tibaldi:

Gestione dei thread in Java LSO 2008

La concorrenza in Java package java.util.concurrent Antonio Furone

Programmazione concorrente con il linguaggio Java

Sistemi Operativi Esercizi Sincronizzazione

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Sincronizzazione dei Thread in Java

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da:

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Sistemi Operativi. Lezione 7 Comunicazione tra processi

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Sincronizzazione tra processi

Esercizi della lezione 5 di Java

Synchronized (ancora)

PROGRAMMAZIONE CONCORRENTE IN JAVA

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

Cifratura simmetrica

Programmazione Concorrente in Java

Architettura Client-Server

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

20 - Input/Output su File

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Meccanismi di sincronizzazione: Semafori e Monitor

Introduzione. Meccanismi di sincronizzazione: Semafori e Monitor. Semafori - Definizione. Semafori - Descrizione informale

10 - Programmare con gli Array

Il costrutto monitor [Hoare 74]

Definizione di thread Proprietà dei thread in Java Gestione delle priorità nei programmi multithreaded Gruppi di thread Accesso a variabili condivise

Corso di Reti di Calcolatori L-A

Corso di Programmazione Concorrente. Java Thread. Valter Crescenzi

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Programmazione concorrente con il linguaggio Java Threads

Esercizio Sincronizzazione Thread

Flussi, lettori e scrittori

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Il costrutto monitor [Hoare 74]

Esempi di esercizi d esame

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

Telematica II 17. Esercitazione/Laboratorio 6

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Programmazione ad Oggetti: JAVA. Esercitazione

Prova d Esame Compito B

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Sistemi operativi - Concetti ed esempi -Settima edizione

GESTIONE INFORMATICA DEI DATI AZIENDALI

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A lezione 14 - Thread in Java

Laboratorio di Programmazione di Rete Corso A

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Transcript:

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();