  |
Se un thread, mentre accede a un metodo sincronizzato, si accorge
di non poter finire il lavoro? |
class Stack {
synchronized void push(int x) {
if(top>stack.length)
// che faccio ???
}
}
  |
Posso uscire senza fare niente oppure sollevare una eccezione |
  |
La cosa migliore sarebbe aspettare che qualcuno faccia una
pop |
  |
La wait() e la notify() fanno parte del linguaggio |
  |
sono metodi di Object. |
  |
wait() ha senso solo in un metodo sincronizzato |
  |
Sospende il thread corrente e lo pone in attesa |
class Stack {
synchronized void push(int x) {
while(top>stack.length)
wait();
...
}
synchronized void pop(int x) {
int r = stack[--top];
notify();
return r;
}
}
  |
il thread viene riattivato non appena qualcuno effettua una notify() sull'oggetto. |
  |
un thread riattivato accede all'oggetto dal punto in cui ha fatto wait() |
|