[Java] Produttore e consumatore

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




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

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.