Avrei altri dubbi sempre sullo stesso argomento:
codice:
class Magazzino {
private int conta = 0;
public Prodotto trova() {
synchronized(this) {
conta++;
}
... trova un prodotto p... (*)
synchronized(this) {
conta;
if(conta == 0)
notifyAll();
}
return p;
}
public synchronized void aggiungi(Prodotto p) {
while(conta > 0)
try {
wait();
}
catch(...){}
... aggiungi un prodotto p ... (**)
notifyAll();
}
}
Supponendo che ci siano più thread che eseguono i metodi trova e aggiungi di un unico oggetto
Magazzino, rispondere alle seguenti domande:
1. Quale lock usano i blocchi sincronizzati: synchronized(this){...}?
Un thread alla volta siccome fanno parte di un unico oggetto (stesso oggetto = setto lock = mutua esclusione)
2. Quale lock usa il metodo aggiungi?
Un thread alla volta siccome proprio tutto il metodo aggiungi(Prodotto p) è sincronizzato
3. E' possibile che più thread eseguano l'istruzione (*) contemporaneamente?
Sì perchè dopo il conta++ il blocco non è più sincronizzato
4. E' possibile che più thread eseguano l'istruzione (**) contemporaneamente?
No perchè tutto il metodo aggiungi(Prodotto p) è sincronizzato
5. E' possibile che un thread esegua l'istruzione (*) e contemporaneamente un altro thread esegua l'istruzione (**)?
Sì perchè l'istruzione (*) non è sincronizzata
6. Si modifichi il metodo aggiungi cancellando l'istruzione while. Cambia qualcosa nel
comportamento della classe Magazzino, in particolare riguardo alle domande 4 e 5?
Togliendo il while chiunque deve attendendere anche se può svolgere la proprio operazione. No le risposte alle domande 4 e 5 rimangono invariate.