Trilhas
/
Java
Java
/
Exercícios
/
Conta bancária
Conta bancária

Conta bancária

Médio

Introdução

Depois de anos preenchendo formulários e esperando, você finalmente conseguiu sua licença bancária. Isso significa que agora você está oficialmente apto a abrir seu próprio banco, ebaaa!

Sua primeira prioridade é pôr os sistemas de TI para funcionar. Depois de um dia de trabalho puxado, você já consegue abrir e fechar contas, além de lidar com saques e depósitos.

Como você não quis se dar ao trabalho de escrever testes, você convida alguns amigos para ajudar a testar o sistema. Mas, depois de apenas cinco minutos, um dos seus amigos afirma que perdeu dinheiro! Embora você tenha certeza de que seu código não tem bugs, você começa a examinar os logs para investigar.

Ah, sim, exatamente como você suspeitava: a culpa é do seu amigo! Ele compartilhou as credenciais de teste com outro amigo, e juntos eles conspiraram para fazer depósitos e saques na mesma conta em paralelo. Quem faria uma coisa dessas?

Enquanto você argumenta que é fisicamente impossível alguém acessar a própria conta em paralelo, seu amigo avisa, com um ar de superioridade, que as regras bancárias exigem que você dê esse suporte. Ou seja: sem suporte a operações bancárias em paralelo, sem sinal verde para entrar em funcionamento. Suspirando, você faz uma nota mental para trabalhar nisso amanhã. Isso vai adiar sua data de lançamento em pelo menos mais um dia, mas, bem...

Instruções

Sua tarefa é implementar contas bancárias com suporte a abertura e fechamento, saques e depósitos de dinheiro.

Como as contas bancárias podem ser acessadas de muitas formas diferentes (internet, celulares, cobranças automáticas), o software do seu banco precisa permitir que as contas sejam acessadas com segurança a partir de várias threads/processos (a terminologia depende da sua linguagem de programação) em paralelo. Por exemplo, pode haver muitos depósitos e saques acontecendo em paralelo; você precisa garantir que não haja condições de corrida entre o momento em que você lê o saldo da conta e o momento em que define o novo saldo.

Deve ser possível fechar uma conta; operações em uma conta fechada devem falhar.

Implementação

Este exercício apresenta a concorrência. Para passar no último teste, pode ser útil conhecer a palavra-chave synchronized ou os locks.

Problemas que surgem ao rodar código em paralelo costumam ser intermitentes, porque dependem da ordem em que o código é executado. Por isso, o último teste roda várias threads diversas vezes para aumentar as chances de detectar um bug. Isso significa que esse teste deve falhar se a sua implementação não for thread safe, mas existe a chance de ele passar simplesmente porque não houve nenhuma tentativa de modificação concorrente. É pouco provável que isso aconteça várias vezes seguidas, já que a ordem em que o código é executado deve variar a cada vez que você roda o teste. Então, se você rodar o último teste algumas vezes e ele passar em todas, é razoável concluir que sua implementação está correta.

Editar via GitHub O link abre em uma nova janela ou aba
Java Exercism

Tudo pronto para começar Conta bancária?

Crie sua conta no Exercism para aprender e dominar Java com 26 conceitos158 exercícios e mentoria humana de verdade, tudo de graça.