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.