Originariamente inviato da valeriAsus
quindi per ogni variabile condizione che c'è, è d'obbligo un metodo per mettere in attesa e un altro per svegliare(await-signal)??
Una condition queue (qui adesso non conta se intrinseca-implicita o esplicita) è appunto una "coda di attesa su condizione". È chiaro che se un X ci entra e aspetta finché la condizione non diventa valida, ci deve essere un Y che lo "sveglia". Insomma, si usa quando ci sono almeno 2 thread che devono fare delle operazioni (tipicamente scambiarsi dati) in modo coordinato.

Originariamente inviato da valeriAsus
Un altro dubbio che mi assilla è perchè vi è il while, ad esempio nel metodo sotto, cioè perchè non andrebbe bene un if???
No il if non va bene. Sia per una condition queue intrinseca che esplicita, l'idioma tipico d'uso è il test della condizione in un while.

Se leggi la documentazione di await() dice:

[...] until one of four things happens:
[.....]
* A "spurious wakeup" occurs.

Cioè è possibile avere un wakeup "spurio", dovuto a questioni interne della JVM. In quel caso la condizione va ritestata. Ecco il motivo del ciclo, un if non sarebbe "robusto" in quel senso.