Sincronizzazione con Java



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

Java threads (2) Programmazione Concorrente

Multithreading in Java. Fondamenti di Sistemi Informativi

Architettura Client-Server

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

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

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

Corso di Reti di Calcolatori L-A

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

GESTIONE DEI PROCESSI

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Gestione dei thread in Java LSO 2008

Programmazione concorrente in Java

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

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

Un esercizio d esame. Flavio De Paoli

MagiCum S.r.l. Progetto Inno-School

Esercizi sugli Oggetti Monitor

Socket & RMI Ingegneria del Software - San Pietro

Telematica II 17. Esercitazione/Laboratorio 6

Tecnologie Web L-A. Java e HTTP. Dario Bottazzi Tel , dario.bottazzi@unibo.it, SkypeID: dariobottazzi. Java e TCP/IP in a Nutshell

Esercizi della lezione 5 di Java

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:

Synchronized (ancora)

19. Introduzione al multi-threading

Lezione 5: Socket SSL/ TLS. Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno

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

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

Programmare con le Socket TCP in java. 2: Application Layer 1

Parte II: Reti di calcolatori Lezione 10

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Programmazione distribuita in Java. Socket & Client-Server

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Esercizi sul Monitor in Java

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).

Capitolo 7: Sincronizzazione

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

Main System Monitor Keyboard

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Scope e visibilità per classi

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

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

Il costrutto monitor [Hoare 74]

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

appunti delle lezioni Architetture client/server: applicazioni client

Programmazione di rete in Java

Un programma concorrente è un programma nel quale diverse computazioni possono essere eseguite allo stesso tempo Alcuni sistemi sono implicitamente

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

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

Esercizio Sincronizzazione Thread

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

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Cifratura simmetrica

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Corso di Reti di Calcolatori

Pronto Esecuzione Attesa Terminazione

Corso di Reti di Calcolatori. Datagrammi

Corso di Telematica II

Java: Compilatore e Interprete

Java thread, concorrenza

appunti delle lezioni Architetture client/server: applicazioni server

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

Sockets in Java. Lorenzo Gallucci

Applicazioni web. Parte 5 Socket

20 - Input/Output su File

13. Chain of Responsibility

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

Laboratorio di Sistemi Thread Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

RMI. Java RMI RMI. G. Prencipe

Gestione delle Eccezioni

Il costrutto monitor [Hoare 74]

Programmazione dei socket con TCP #2

Thread e Task. L20_MultiThread 2

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

Corso di Programmazione Concorrente. Java Thread. Valter Crescenzi

Reti di Calcolatori:

Monitor. Introduzione. Struttura di un TDA Monitor

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

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

Sistemi Operativi Esercizi Sincronizzazione

Corso sul linguaggio Java

Prova d Esame Compito A

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

Транскрипт:

Sincronizzazione con Java

Corse critiche e sincronizzazione Java implementa un meccanismo simile al monitor per garantire la sincronizzazione fra thread Ogni oggetto ha un lock associato ad esso Nelle classi possono essere definiti metodi synchronized synchronized int mymethod() Un solo thread alla volta può eseguire un metodo synchronized Se un oggetto ha più di un metodo sincronizzato, comunque uno solo può essere attivo Sistemi Operativi 11/12 Sincronizzazione con Java 2

Metodi synchronized La chiamata di un metodo sincronizzato richiede il possesso del lock Se un thread chiamante non possiede il lock (un altro thread ne è già in possesso), il thread viene sospeso in attesa del lock Il lock è rilasciato quando un thread esce da un metodo sincronizzato lock owner Thread in attesa del lock Sistemi Operativi 11/12 Sincronizzazione con Java 3

Metodi synchronized synchronized void incrementacontatore() { int tmp = contatore + 1; if(tmp>maxcontatore) maxcontatore = tmp; aspetta(milliaspetta); contatore = tmp; void synchronized decrementacontatore() { int tmp = contatore; aspetta(milliaspetta); contatore = tmp - 1; Sistemi Operativi 11/12 Sincronizzazione con Java 4

Sincronizzazione Un Thread può decidere di non proseguire l esecuzione Può allora volontariamente chiamare il metodo wait all interno di un metodo sincronizzato chiamare wait in un contesto diverso genera un errore Sistemi Operativi 11/12 Sincronizzazione con Java 5

Il metodo wait() Quando un thread esegue wait(), si verificano i seguenti eventi: 1. il thread rilascia il lock 2. il thread viene bloccato 3. il thread è posto in una coda di attesa 4. gli altri thread possono ora competere per il lock lock owner Thread in attesa del lock Thread in bloccati (wait) Sistemi Operativi 11/12 Sincronizzazione con Java 6

Il metodo notify() Nel momento in cui una condizione che ha provocato una attesa si è modificata si può riattivare un singolo thread in attesa tramite notify Quando un thread richiama notify(): 1) viene selezionato un thread arbitrario T fra i thread bloccati 2) T torna fra i thread in attesa del lock 3) T diventa Eseguibile Sistemi Operativi 11/12 Sincronizzazione con Java 7

insert() con wait/notify public synchronized void insert(object item) { while(count==buffer_size) { try { wait(); catch(interruptedexception e) { ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; if(count==1) notify(); Sistemi Operativi 11/12 Sincronizzazione con Java 8

remove() con wait/notify public synchronized Object remove() { while(count==0) { try { wait(); catch(interruptedexception e) { --count; Object item = buffer[out]; out = (out + 1) % BUFFER_SIZE; if(count==buffer_size-1) notify(); return item; Sistemi Operativi 11/12 Sincronizzazione con Java 9

La classe BoundedBuffer completa public class BoundedBuffer { private static final int BUFFER_SIZE = 5; private int count, in, out; private Object[] buffer; public BoundedBuffer() { count = 0; in = 0; out = 0; buffer = new Object[BUFFER_SIZE]; synchronized Object remove() { synchronized void insert(object item) { Sistemi Operativi 11/12 Sincronizzazione con Java 10

Sincronizzazioni multiple notify() seleziona un thread arbitrario. Non sempre questo è il comportamento desiderato. Java non permette di specificare il thread che si vuole selezionare notifyall() risveglia tutti i thread in attesa. In questo modo si permette ai thread stessi di decidere chi deve proseguire. notifyall() è una strategia conservativa utile quando più thread sono in attesa Sistemi Operativi 11/12 Sincronizzazione con Java 11

Metodo sleep static void sleep( millisecondi ) Il Thread si sospende (non richiede l uso del processore) per un certo numero di millisecondi Nel frattempo possono andare in esecuzione thread a bassa priorità NB sleep non restituisce il possesso del lock Sleep è un metodo statico della classe Thread Wait è un metodo della classe Object Sistemi Operativi 2011/12 Thread 12

Sincronizzazione di blocco Si definisce scope di un lock è il tempo fra la sua acquisizione ed il suo rilascio Tramite la parola chiave synchronized si possono indicare blocchi di codice piuttosto che un metodo intero Ne risulta uno scope generalmente più piccolo rispetto alla sincronizzazione dell'intero metodo Sistemi Operativi 11/12 Sincronizzazione con Java 13

Sincronizzazione di blocco Object mutexlock = new Object(); public void somemethod() { noncriticalsection(); synchronized(mutexlock) { criticalsection(); noncriticalsection(); Sistemi Operativi 11/12 Sincronizzazione con Java 14

Sincronizzazione di blocco public class TestRunnableSync implements Runnable { int count; public void run() { int tmp; synchronized (this) { tmp = count++; String name = Thread.currentThread().getName(); System.out.println(name + " " + tmp); public static void main(string[] args) { int n=args.length>0?integer.parseint(args[0]):10; Runnable runnable = new TestRunnableSync(); for(int i=0; i<n; i++) { Thread th = new Thread(runnable); th.start(); Sistemi Operativi 11/12 Sincronizzazione con Java 15

Versione non sincronizzata public class TestRunnableSync implements Runnable { int count; public void run() { int tmp; tmp = count++; String name = Thread.currentThread().getName(); System.out.println(name + " " + tmp); public static void main(string[] args) { int n=args.length>0?integer.parseint(args[0]):10; Runnable runnable = new TestRunnableSync(); for(int i=0; i<n; i++) { Thread th = new Thread(runnable); th.start(); Sistemi Operativi 11/12 Sincronizzazione con Java 16

TestRunnableSync TestRunnableSync count Un solo oggetto Runnable Thread Thread Thread Thread... N oggetti Thread Sistemi Operativi 11/12 Sincronizzazione con Java 17

Daemon Threads Sono thread Che effettuano operazioni ad uso di altri thread Per esempio: Garbage collector Sono eseguiti in background Usano cioè il processore solo quando altrimenti il tempo macchina andrebbe perso A differenza degli altri thread non impediscono la terminazione di una applicazione Quando sono attivi solo thread daemon il programma termina Occorre specificare che un thread è un daemon prima dell invocazione di start - setdaemon( true ); Il metodo isdaemon Restituisce true se il thread è un daemon thread Sistemi Operativi 11/12 Sincronizzazione con Java 18

La classe Timer La classe java.util.timer permette la schedulazione di processi nel futuro (attenzione esiste anche la classe javax.swing.timer dal comportamento parzialmente diverso) Costruttore: Timer() void schedule(timertask task, long delay, long period) Permette di eseguire un task periodico dopo un ritardo specificato Esistono altri costruttori e altri metodi (si veda scheduleatfixedrate ) Sistemi Operativi 11/12 Sincronizzazione con Java 19

La classe TimerTask TimerTask è una classe astratta occorre estenderla e definire il metodo run (ciò che il task deve fare) long periodo = 1000; // per esempio un secondo java.util.timer timer = new java.util.timer(); timer.schedule(new MyTimerTask(), 0, periodo); public class MyTimerClass extends java.util.timertask { public void run() { // ciò che devo fare dovrebbe richiedere un tempo inferiore a periodo Sistemi Operativi 11/12 Sincronizzazione con Java 20

Problemi con i Thread Calcolare la somma dei primi N interi (di N valori di un vettore) Spezzare l'operazione in un numero di Thread prefissato (scelto dall'utente al momento dell'esecuzione), ognuno dei quali ne considera un sottoinsieme disgiunto Si noti che posso calcolare la somma di tutti i risultati parziali solo dopo che tutti i Thread hanno terminato il loro lavoro Progettare un orologio Con la classe Thread Con la classe TimerTask Possibile evoluzione: progettare una animazione Sistemi Operativi 11/12 Sincronizzazione con Java 21

Semafori Java, fino alla versione 1.4, non mette a disposizione una implementazione di un semaforo, ma un semplice semaforo può essere costruito tramite il meccanismo della sincronizzazione public interface Semaforo { public void up(); public void down(); Sistemi Operativi 11/12 Sincronizzazione con Java 22

Un semplice semaforo public class SempliceSemaforo { private int value; public SempliceSemaforo() { value = 0; public SempliceSemaforo(int v) { value = v; Sistemi Operativi 11/12 Sincronizzazione con Java 23

Un semplice semaforo public synchronized void up() { value++; notify(); public synchronized void down() { while(value==0) { try { wait(); catch (InterruptedException ie) { value--; public synchronized void down() throws InterruptedException { while(value==0) wait(); value--; Sistemi Operativi 11/12 Sincronizzazione con Java 24

Socket Un socket è definito come un estremo di un canale di comunicazione È la concatenazione di un indirizzo IP e di una porta Il socket 192.168.0.2:1625 si riferisce alla porta 1625 sull host 192.168.0.2 Sistemi Operativi 11/12 Sincronizzazione con Java 25

Comunicazione fra socket host X (192.168.0.2/1625) Normalmente consiste in una coppia di socket socket (192.168.0.2/1625) web server (192.168.1.8/80) socket (192.168.1.8/80) Sistemi Operativi 11/12 Sincronizzazione con Java 26

Socket import java.net.*; import java.io.*; public class DateServer { public static void main(string[] args) throws IOException { ServerSocket sock = new ServerSocket(6013); System.out.println("server = " + sock); while (true) { Socket client = sock.accept(); System.out.println("client = " + client); PrintWriter pout = new PrintWriter( client.getoutputstream(), true); pout.println(new java.util.date().tostring()); pout.close(); client.close(); //sock.close(); Sistemi Operativi 11/12 Sincronizzazione con Java 27

Socket import java.net.*; import java.io.*; public class DateClient { public static void main(string[] args) throws IOException { InputStream in = null; BufferedReader bin = null; Socket sock = new Socket("127.0.0.1",6013); in = sock.getinputstream(); bin = new BufferedReader(new InputStreamReader(in)); String line; while( (line = bin.readline())!= null) System.out.println(line); sock.close(); Sistemi Operativi 11/12 Sincronizzazione con Java 28

Un server HTTP import java.io.*; import java.net.serversocket; import java.net.socket; public class HTTPD implements Runnable { static public void main(string[] args) throws IOException { int port=args.length>0?integer.parseint(args[0]): 80; boolean multithread = args.length>1 && "-s".equals(args[1]); ServerSocket server = new ServerSocket(port); System.out.println("Serving in port " + port); while (true) { HTTPD client = new HTTPD(server.accept()); if(multithread) { new Thread(client).start(); else { client.run(); vedi slide seguenti Sistemi Operativi 11/12 Sincronizzazione con Java 29

Un server HTTP: il costruttore private Socket client; private OutputStream output; private BufferedReader input; public HTTPD(Socket client) throws IOException { this.client = client; System.out.println("New client: " + client); InputStream inputstream = client.getinputstream(); output = client.getoutputstream(); input = new BufferedReader( newinputstreamreader(inputstream)); Sistemi Operativi 11/12 Sincronizzazione con Java 30

Un server HTTP: il metodo run public void run() { try { while(true) { String line = input.readline(); if (line == null) { System.out.println("Connection closed."); output.close(); client.close(); return; if (line.startswith("get /")) { output.write(getanswer(line).getbytes()); output.flush(); System.out.println(line); catch (IOException ex) { Sistemi Operativi 11/12 Sincronizzazione con Java 31

Un server HTTP: il metodo getanswer /** * Return the new page.<br> * Subclasses of HTTPD should override this method. * * @param line The request from the client. * @return the new page. */ protected String getanswer(string line) { String s = new java.util.date().tostring() + '\n'; String answer = "HTTP/1.1 200 OK\n" + "Content-Length: " + s.length() + "\n" + "Content-Type: text/html\n\n" + s; return answer; Sistemi Operativi 11/12 Sincronizzazione con Java 32

Messaggio di richiesta (Firefox) GET / HTTP/1.1 Host: 127.0.0.1:8080 User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 Accept: text/html,application/xhtml+xml,application/xml; q=0.9,*/*;q=0.8 Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Cache-Control: max-age=0 Sistemi Operativi 11/12 Sincronizzazione con Java 33

Un server web Cosa manca? La gestione delle informazioni che arrivano dal client Il trattamento effettivo delle richieste Uno spegnimento gentile del server Il trattamento delle eccezioni Una applicazione HTTP client Sistemi Operativi 11/12 Sincronizzazione con Java 34