Ah, ora ho capito, sta cosa non serve! La parola synchronized serve appunto per questo, se un thread è all'interno di uno dei metodi indicati con questa parola chiave nessun altro thread può utilizzare un qualsiasi metodo della stessa classe che abbia anch'esso la parola synchronized nell'intestazione. Per riassumere, se la tua classe ha 10 metodi tutti synchronized e un thread accede ad uno di questi metodi nessun altro thread può accedere a nessuno degli altri metodi finchè questo in esecuzione non ha terminato.
Ho visto il codice, il tuo metodo tutto sommato va bene però il synchronized come ti ho detto va messo per sicurezza a tutti i metodi della classe che indicano la risorsa condivisa. E poi una piccola correzione tecnica, questo non risveglierà mai niente perchè entra nell'if solo se occupato è true, cosa che dal tuo codice è impossibile. Tra l'altro questo if è inutile...
codice:
public synchronized void libero(){
occupato = false;
if (occupato){
notifyAll();
}
}
direi meglio così
codice:
public synchronized void libero(){
occupato = false;
notifyAll();
}
Per vedere se funziona ti conviene fare delle prove e vedere come si comportano i vari thread, magari aggiungendo dei System.out.println() con del testo qua e là così da capire dove e come viene eseguito il codice.
Ciao.