ViniGodoy:
É melhor fazer da primeira forma.
Sempre que o código sai do bloco sinchronized, seja por uma exception, return ou pelo fluxo normal, a sincronização termina.
Outra coisa, ao postar código, use a tag code:
http://www.guj.com.br/posts/list/50115.java
Opa, valeu pela dica, usarei a tag code na próxima vez.
Não se se entendi bem a resposta, então vou abusar um pouco da sua paciência e acrescentar mais informações sobre o meu questionamento para aprofundarmos mais a questão:
Procurando aprender mais sobre esse obscuro assunto que é Threads, me deparei com o artigo “Why is Thread.stop deprecated?”. Nele entendi que o método stop não é recomendado pois ele força a liberação dos locks dos objetos de maneira anormal, ou seja, deixando as variáveis do bloco sincronizado com valores incosistente. No meu entendimento inconsistente seria a não garantia da sincronização dos valores trabalhados no stack com os contidos no heap, em outras palavras a não execução da instrução de fechamento do bloco sincronizado.
citando o artigo: “The monitors are unlocked as the ThreadDeath exception propagates up the stack”, ThreadDeath é a exception disparada ao se invocar o método stop.
Com base neste meu entendimento, que talvez esteja equivocado, fiquei imaginando se o return teria a possibilidade de também liberar os locks dos objetos de maneira anormal.