No arquivo ServidorPrimos.java você encontrará um exemplo de programa que cria uma thread por cliente. 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. Deve ser utilizada a implementação de read/write lock presente no pacote java.util.concurrent.locks.