- Ao sincronizar um método ou um bloco qualquer com a palavra chave syncronized, como esse bloco é liberado? Usando um notify() implícito? Ou um notifyAll() implícito?
Por exemplo, dado o código:
syncronized(this){
//codigos aqui
}
Quando ele acaba de executar, ele faz o que exatamente para avisar outras threads que eventualmente estejam esperando a liberação desse bloco? Eu acho que ele faz algo assim:
syncronized(this){
//codigos aqui
notifyAll();
}
só que implicitamente…
- Imagina que eu tenho o seguinte código:
syncronized(this){
//codigos de região crítica aqui
notifyAll();
//mais código de região crítica aqui
}
Ao executar o notifyAll() no meio do código, ele libera o lock do objeto this, correto? Isso quer dizer que a parte marcada com " //mais código de região crítica aqui" poderá executar sem sincronismo? Ou seja, mesmo que esteja dentro do bloco syncronized, ao chamar o notifyAll() quebramos o sincronismo, não? Ou o código marcado como " //mais código de região crítica aqui" nem é executado? (como uma exceção sendo lançada ali). O que acontece exatamente ao chamarmos notifyAll() ou notify() no meio de um bloco syncronized?
Obrigado!!! 
Deixa eu perguntar outra coisa. A única maneira de uma thread entrar no estado “blocked” é tentando entrar em um bloco syncronized (supondo que este bloco já esteja sendo usado por outra thread, claro) ? E a única maneira de uma thread entrar no estado “wait” é chamando o wait explicitamente? Existem outras formas?