No arquivo ServidorPrimos.java você encontrará um exemplo de programa que procede dessa maneira. O programa ServidorPrimos é um servidor que aceita uma seqüência de números (através de uma conexão TCP) e, para cada número, devolve ao cliente uma string que informa se o número é primo ou não. Para cada conexão recebida ele cria uma thread para lidar com a seqüência de números oriunda desta conexão. O recebimento de uma linha vazia (uma String vazia) indica que o cliente não tem mais números para fornecer ao servidor.
Para deixar isso mais concreto, pense num cliente transferindo
da conta
para a conta
. O servidor pode passar por um estado
intermediário, em que
já foi subtraído do saldo de
mas ainda
não foi adicionado ao saldo de
, mas esse estado não deve ser
visível para nenhum outro cliente! Se, concorrentemente com a
transferência, algum cliente pedir (numa só operação) os saldos
das duas contas, ele deve receber os dois saldos antes da transferência
ou os dois saldos depois da transferência, mas nunca um estado
intermediário.
O programa ServContas deve garantir a isolação das operações usando read/write locks (um lock por conta) e o protocolo two-phase locking (2PL) discutido em classe. Sugestão: use o pacote Java util.concurrent, disponibilizado por Doug Lea. Esse pacote tem várias implementações de read/write locks.