Testei a classe aki algumas vezes e em todas imprimiu:
Thread-0
Thread-0
main
main
main
A classe é inicializada pela thread main, e a partir dessa thread é criada uma outra e a mesma é inicializada. A partir daí o programa possui duas threads, uma com o nome main e a outra com o nome Thread-0.
Não sei explicar direito o funcionamento do synchronized, do wait e do notify. Sei que os dois blocos de execução das duas threads são sincronizados pelo mesmo objeto. Isso significa q quando uma das threads obtém o lock desse objeto, a outra thread não poderá ser executada. O SO decide qual das duas threads executar primeiro.
Se executar o Thread-0 primeiro, esse obterá o lock e executará até o fim, imprimindo Thread-0 duas vezes. Nesse caso eu não sei o q acontece com o notify, pois não teve nenhum wait nesse caso. Acredito q seja desconsiderado. Mas depois disso a Thread-0 morrerá e será executada a main. Ai eu tb não sei o q acontece com o wait, pois não tem nenhuma outra thread, portanto eu acredito q seja desconsiderado tb. E então main será impresso main 3 vezes.
Se executar o main primeiro, esse obterá o lock e executará até o wait. Ai, acredito eu, o processo seja verificar se existe alguma outra thread q tenta obter o msm lock, mas não tenho certeza disso. Se for isso, será encontrada a Thread-0, q será executada até o fim e notificará a umas das threads q estejam esperando. Como só existe uma, a main, essa será executada, produzindo a msm saída da citada anteriormente.
Eu entendi assim, mas não sou nenhum expert. Tô aprendendo tb.