Sincronização

Olá pessoal…

Tenho um problema que é semelhante ao problema da transferência de valores entre contas bancárias…Preciso bloquear as duas contas para que não ocorra inconsistências.Pensei em usar dois blocos synchronized aninhados, mas isso está me cheirando a deadlock:

Ex:
synchronized(conta1)
{
synchronized(conta2)
{

}
}

Pode ocorrer de um processo A querer transferir um valor x da conta 1 para a conta 2, enquanto um processo B queira transferir um valor y da conta 2 para a conta 1. Num contexto desses, A pode obter o bloqueio da conta 1 e B pode obter o bloqueio da conta 2. Mas A ficará esperando para obter o bloqueio da conta 2, enquanto B ficará esperando para obter o bloqueio da conta 1. Deadlock!!!
Está certo meu raciocínio?

Num problema desses, qual a solução mais interessante? Usar um java.util.concurrent.Semaphore?

O que o pessoal me diz?

Valeu gente…
java.util.concurrent.Semaphore