Java threads (2) Programmazione Concorrente



Похожие документы
Java Virtual Machine

Multithreading in Java. Fondamenti di Sistemi Informativi

Un esercizio d esame. Flavio De Paoli

Programmazione Concorrente in Java

GESTIONE DEI PROCESSI

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

Synchronized (ancora)

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

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

Gestione dei thread in Java LSO 2008

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D

Il costrutto monitor [Hoare 74]

Esercizi sugli Oggetti Monitor

Sistemi Operativi Esercizi Sincronizzazione

Programmazione concorrente in Java

Telematica II 17. Esercitazione/Laboratorio 6

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:

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

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Il costrutto monitor [Hoare 74]

Esercizi sul Monitor in Java

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

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

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Ottava Esercitazione. introduzione ai thread java mutua esclusione

LA SINCRONIZZAZIONE TRA PROCESSI

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi

Esercizi della lezione 5 di Java

Main System Monitor Keyboard

I THREAD O PROCESSI LEGGERI Generalità

Algoritmi di Ricerca. Esempi di programmi Java

Sincronizzazione con Java

Concorrenza e sincronizzazione

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Programmazione a Oggetti Lezione 10. Ereditarieta

19. Introduzione al multi-threading

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

Monitor. Introduzione. Struttura di un TDA Monitor

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

Architettura Client-Server

10 - Programmare con gli Array

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

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

13. Chain of Responsibility

Modulo 4: Ereditarietà, interfacce e clonazione

Concetto di Funzione e Procedura METODI in Java

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

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

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

Introduzione ai Metodi Formali

Programmazione 1 A.A. 2015/2016

Parola chiave extends

Test di unità con JUnit4

Capitolo 7: Sincronizzazione

Esempi di esercizi d esame

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

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

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

La selezione binaria

Il problema del produttore e del consumatore. Cooperazione tra processi

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

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

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

La struttura dati ad albero binario

Inizializzazione, Assegnamento e Distruzione di Classi

Java Threads. esempi

Pronto Esecuzione Attesa Terminazione

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

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

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Multithreading in Java

Meccanismi di sincronizzazione: Semafori e Monitor

CAPITOLO 24 I MONITOR

I file di dati. Unità didattica D1 1

Introduzione JDBC interfaccia java.sql driver caricare i driver

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

Sistemi Operativi. Lezione 7 Comunicazione tra processi

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

costruttori e distruttori

Prova di Laboratorio di Programmazione

Tipi di Dato Ricorsivi

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

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

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

Транскрипт:

Java threads (2) emanuele lattanzi isti information science and technology institute 1/28 Programmazione Concorrente Utilizzo corretto dei thread in Java emanuele lattanzi isti information science and technology institute 2/28 1

Safety & Liveness Programmare applicazione concorrenti è molto più difficile Gestire la comunicazione fra thread e processi Gestire l accesso alle risorse condivise Evitare il blocco del processo emanuele lattanzi isti information science and technology institute 3/28 Safety Nothing bad happens Mutual Exclusion: risorse condivise aggiornate in modo atomico Sincronizzazione: alcune operazioni devono attendere se condivise Consistenza: le risorse sono in stato consistente (es. non leggere da un buffer vuoto) emanuele lattanzi isti information science and technology institute 4/28 2

Liveness Something good happens No Deadlock: un processo può sempre accedere ad una risorsa condivisa No Starvation: tutti i processi, prima o poi, riescono ad accedere ad una risorsa condivisa emanuele lattanzi isti information science and technology institute 5/28 Condivisione dati Le operazioni su risorse e servizi condivisi non sono eseguite in modo atomico Quando eseguono operazioni su dati condivisi possono essere interrotti prima di terminare la transazione (esecuzione non atomica di sezioni di codice) emanuele lattanzi isti information science and technology institute 6/28 3

OggettoCondiviso.java public class OggettoCondiviso{ private int MAX_POSTI = 20; int totposti = 0; public boolean assegnaposti(string cliente) { System.out.println("Richiesta di ass. un posto da " + cliente); if (this.totposti+1 <= this.max_posti) { System.out.println("Assegna un posto a " + cliente); this.totposti++; return true; return false; emanuele lattanzi isti information science and technology institute 7/28 AssegnatorePosti.java class AssegnatorePosti extends Thread { OggettoCondiviso so; public AssegnatorePosti ( String name, OggettoCondiviso so){ super( name ); this.so = so; public void run() { while(so.assegnaposti(thread.currentthread().getname())) { System.out.println( Assegnato un nuovo posto ); System.out.println(Thread.currentThread().getName() + finito" ); emanuele lattanzi isti information science and technology institute 8/28 4

ThreadTest3.java public class ThreadTest3 { public static void main( String args[] ) { AssegnatorePosti thread1, thread2; OggettoCondiviso so = new OggettoCondiviso(); thread1 = new AssegnatorePosti( "thread1", so); thread2 = new AssegnatorePosti( "thread2", so); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); catch (Exception e){ System.err.println("errore"); System.out.println( Assegnati +so.totposti); emanuele lattanzi isti information science and technology institute 9/28 Problemi Se più thread la eseguono in parallelo e si ha un context switch nel mezzo della transazione si avrà la risorsa sarà in uno stato inconsistente: Il numero di posti assegnato alla fine sarà maggiore di quello realmente disponibile! Race condition emanuele lattanzi isti information science and technology institute 10/28 5

Soluzione Accesso sincronizzato (atomico): Un solo thread alla volta deve eseguire quel metodo Se un thread lo sta già eseguendo gli altri dovranno aspettare Più esecuzioni concorrenti di quel codice devono in realtà divenire serializzate emanuele lattanzi isti information science and technology institute 11/28 Monitor in Java Oggetto con un metodo synchronized Ogni oggetto può essere un monitor Metodi dichiarati synchronized Solo un thread alla volta può eseguire un tale metodo su uno stesso oggetto: Prima di eseguirlo deve ottenere il lock Appena uscito dal metodo il lock viene rilasciato Se ci sono più metodi synchronized Se un thread sta eseguendo un metodo synchronized altri thread non possono eseguire altri metodi synchronized su uno stesso oggetto Lo stesso thread può eseguire altri metodi synchronized sullo stesso oggetto Blocchi di codice dichiarati synchronized emanuele lattanzi isti information science and technology institute 12/28 6

Sincronizzazione implicita public class OggettoCondiviso{ private int MAX_POSTI = 20; int totposti = 0; public synchronized boolean assegnaposti(string cliente) { System.out.println("Richiesta di ass. un posto da " + cliente); if (this.totposti+1 <= this.max_posti) { System.out.println("Assegna un posto a " + cliente); this.totposti++; return true; return false; emanuele lattanzi isti information science and technology institute 13/28 Sincronizzazione esplicita public class OggettoCondiviso{ private int MAX_POSTI = 20; int totposti = 0; public boolean assegnaposti(string cliente) { System.out.println("Richiesta di ass. un posto da " + cliente); synchronized(this){ if (this.totposti+1 <= this.max_posti) { System.out.println("Assegna un posto a " + cliente); this.totposti++; return true; return false; emanuele lattanzi isti information science and technology institute 14/28 7

Cooperazione fra thread Produttore-Consumatore: Produttore scrive dati in una memoria condivisa Consumatore recupera dati dalla stessa memoria Accesso alla struttura in modo sincronizzato emanuele lattanzi isti information science and technology institute 15/28 Non solo synchronized Non leggere quando la memoria è vuota, non scrivere quando la memoria è piena Usare solo parti di codice synchronized non serve più Produttore acquisisce il lock La memoria è piena, aspetta che si liberi Perché si liberi il consumatore deve accedere alla memoria, che è bloccata Deadlock! emanuele lattanzi isti information science and technology institute 16/28 8

Non solo synchronized Non leggere cose già lette, non sovrascrivere cose non ancora lette Usare solo parti di codice synchronized non serve più Produttore acquisisce il lock Scrive una nuova informazione Produttore riacquisisce il lock nuovamente, prima del consumatore Produttore sovrascrive un informazione non ancora recuperata dal consumatore emanuele lattanzi isti information science and technology institute 17/28 ProduttoreConsumatoreErrato.java class ProduttoreErrato extends Thread { CellaCondivisaErrata cella; public ProduttoreErrato(CellaCondivisaErrata cella) { this.cella = cella; public void run() { for (int i = 1; i <= 10; ++i) { synchronized (cella) { ++(cella.valore); System.out.println ("Prodotto: " + i); emanuele lattanzi isti information science and technology institute 18/28 9

ProduttoreConsumatoreErrato.java class ConsumatoreErrato extends Thread { CellaCondivisaErrata cella; public ConsumatoreErrato(CellaCondivisaErrata cella) { this.cella = cella; public void run() { int valore_letto; for (int i = 0; i < 10; ++i) { synchronized (cella) { valore_letto = cella.valore; cella.valore--: System.out.println ("Consumato: " + valore_letto); emanuele lattanzi isti information science and technology institute 19/28 Attesa & Notifica Un thread può chiamare wait() su un oggetto sul quale ha il lock: Il lock viene rilasciato Il thread va in stato di waiting Altri thread possono ottenere tale lock Effettuano le opportune operazioni e chiamano: notify() per risvegliare un singolo thread in attesa notifyall() per risvegliare tutti i thread in attesa su quell oggetto I thread risvegliati devono comunque riacquisire il lock I notify non sono cumulativi Questi metodi sono definiti nella classe Object emanuele lattanzi isti information science and technology institute 20/28 10

ProduttoreConsumatore.java class Produttore extends Thread { CellaCondivisa cella; public Produttore(CellaCondivisa cella) { this.cella = cella; public void run() { for (int i = 1; i <= 10; ++i) { synchronized (cella) { while (! cella.scrivibile) { try { cella.wait(); catch (InterruptedException e) { ++(cella.valore); cella.scrivibile = false; // cede il turno cella.notify(); // risveglia il consumatore System.out.println ("Prodotto: " + i); emanuele lattanzi isti information science and technology institute 21/28 ProduttoreConsumatore.java class Consumatore extends Thread { CellaCondivisa cella; public Consumatore(CellaCondivisa cella) { this.cella = cella; public void run() { int valore_letto; for (int i = 0; i < 10; ++i) { synchronized (cella) { while (cella.scrivibile) { try { cella.wait(); catch (InterruptedException e) { valore_letto = cella.valore; cella.scrivibile = true; // cede il turno cella.notify(); // notifica il produttore System.out.println ("Consumato: " + valore_letto); emanuele lattanzi isti information science and technology institute 22/28 11

Attenzione! Un notify effettuato su un oggetto su cui nessun thread è in wait viene perso (non è un semaforo) Usciti dallo stato di wait si dovrebbe ricontrollare la condizione Se ci possono essere più thread in attesa usare notifyall notifyall risveglia tutti i thread in attesa, ma uno alla volta riprenderà il lock Prima che un thread in attesa riprenda l esecuzione il thread che ha notificato deve rilasciare il monitor (uscire dal blocco synchronized) emanuele lattanzi isti information science and technology institute 23/28 ProduttoreConsumatore2.java class CellaCondivisa2 { private int valore = 0; private boolean scrivibile = true; public synchronized void produci(int i) { while (! scrivibile) wait(); // catch valore = i; scrivibile = false; notify(); public synchronized int consuma() { while (scrivibile) wait(); // catch scrivibile = true; notify(); return valore; emanuele lattanzi isti information science and technology institute 24/28 12

ProduttoreConsumatore2.java class Produttore2 extends Thread { CellaCondivisa2 cella; public void run() { for (int i = 1; i <= 10; ++i) { cella.produci(i); System.out.println ("Prodotto: " + i); class Consumatore2 extends Thread { CellaCondivisa2 cella; public void run() { int valore_letto; for (int i = 0; i < 10; ++i) { valore_letto = cella.consuma(); System.out.println ("Consumato: " + valore_letto); emanuele lattanzi isti information science and technology institute 25/28 Versioni con timeout Esistono delle versioni con timeout per i metodi che possono bloccare un thread: join(long millisecs) wait(long millisecs) Anche versioni con nanosecondi! emanuele lattanzi isti information science and technology institute 26/28 13

Daemon threads Sono eseguiti in background Nei momenti in cui il processore non viene usato (es. garbage collector) Il programma può terminare ugualmente: Quando ci sono in esecuzione solo daemon thread il programma termina Devono essere settati come daemon prima di chiamare start (metodo setdaemon(true)) emanuele lattanzi isti information science and technology institute 27/28 Gruppi di thread I thread possono essere raggruppati in gruppi di thread Si possono creare gerarchie di gruppi di thread Si possono interrompere tutti i thread di un gruppo in un colpo solo Si passa il gruppo ad un thread tramite il costruttore emanuele lattanzi isti information science and technology institute 28/28 14