[Java] Produttore e consumatore
Cosa cambia tra queste due scritture? Sono corrette entrambre?
Nel codice sono solamente invertite le due righe con asterisco (*)
Provo a dare la mia versione.
1 Il thread si può interrompere solo con l'esecuzione della return oppure della wait.
2 Il thread si può interrompere, come nel caso precedente, con l'esecuzione della return e della wait. Ma in questo caso anche tra la fine del blocco synchronized e la fine del ciclo while e tra l'inizio del while e l'inizio del synchronized.
Sono anche corrette entrambe.
Nel codice sono solamente invertite le due righe con asterisco (*)
Provo a dare la mia versione.
1 Il thread si può interrompere solo con l'esecuzione della return oppure della wait.
2 Il thread si può interrompere, come nel caso precedente, con l'esecuzione della return e della wait. Ma in questo caso anche tra la fine del blocco synchronized e la fine del ciclo while e tra l'inizio del while e l'inizio del synchronized.
Sono anche corrette entrambe.
public class buffer { <una qualche struttura dati> public void add(int elem) { synchronized(this) { <---------------------------------------------------------- (*) while(true) { <---------------------------------------------------------- (*) <se buffer non pieno, aggiungi e fai return> <altrimenti se buffer pieno, vai in stato waiting> } } } }
public class buffer { <una qualche struttura dati> public void add(int elem) { while(true) { <---------------------------------------------------------- (*) synchronized(this) { <---------------------------------------------------------- (*) <se buffer non pieno, aggiungi e fai return> <altrimenti se buffer pieno, vai in stato waiting> } } } }
Risposte
Secondo me la versione corretta è la prima:
- con synchronized entri in una regione critica ed acquisisci un lock che, a seconda del verificarsi o meno di determinate condizioni, rilasci definitamente in seguito all'esecuzione di una determinata operazione o rilasci immediatamente in attesa di riacquisirlo in seguito ad un'azione di notifica lanciata da un altro processo in esecuzione che ha, a sua volta, acquisito il lock in oggetto;
- se il metodo wait() viene eseguito da un processo che non ha acquisito nessun lock viene lanciata una eccezione di tipo InterruptedException.
Se hai dubbi o domande in merito chiedi pure.
- con synchronized entri in una regione critica ed acquisisci un lock che, a seconda del verificarsi o meno di determinate condizioni, rilasci definitamente in seguito all'esecuzione di una determinata operazione o rilasci immediatamente in attesa di riacquisirlo in seguito ad un'azione di notifica lanciata da un altro processo in esecuzione che ha, a sua volta, acquisito il lock in oggetto;
- se il metodo wait() viene eseguito da un processo che non ha acquisito nessun lock viene lanciata una eccezione di tipo InterruptedException.
Se hai dubbi o domande in merito chiedi pure.