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