uma outra explicação…é que
o bloco sincronized esta travado o bloco de código para apenas uma thread.
quando se usa sincronized(this) ou somente sincronized…significa que esta travando o bloco.
imagine 2 threads… uma produz e a outra consome…
quando a thread 1 entrar no bloco, ela vai chegar no wait() e ficar aguardar um tempo para que de tempo da outra thread ser a proxima …
sem sincronized seu código poderá rodar assim:
thread1 acessa bloco
thread1 acessa bloco
thread2 acessa bloco
thread1 acessa bloco
thread1 acessa bloco
thread2 acessa bloco
thread2 acessa bloco
de maneira aleatória…
com sincronized…seu código roda assim:
(inicio) thread1 acessa bloco (dorme)
(acorda) thread2 acessa bloco (dorme)
(acorda) thread1 acessa bloco (dorme)
(acorda) thread2 acessa bloco (dorme)
(acorda) thread1 acessa bloco (dorme)
de forma sequencial.
seu código não precisa de notifyAll() pelo fato do Wait( tempo ) ter um tempo para aguardar, em algumas vezes a thread entra em wait() até ser “acordada/notificada” por outra thread.