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