Mini-prova Paulo Borba Centro de Informática Universidade Federal de Pernambuco Recife, 23 de agosto de 2002 -------------------------------------------------------------------------------- 1. O método inserir definido abaixo seria seguro em um ambiente concorrente? Caso duas pessoas tentem inserir duas contas ao mesmo tempo, a implementação do método garante que as duas contas serão sempre inseridas no array? Justifique brevemente a sua resposta. Caso necessário, o que teria que ser alterado nesta classe para garantir a segurança em um ambiente concorrente? class RepositorioContasArray { private Conta[] contas; private int proxima; RepositorioContasArray(int tamanho) { contas = new Conta[tamanho]; proxima = 0; } void inserir(Conta conta) { contas[proxima] = conta; proxima = proxima + 1; } ... } -------------------------------------------------------------------------------- // Ives José de Albuquerque Macêdo Júnior (ijamj@cin.ufpe.br) Resposta: 1. Não, porque ele acessa um recurso que pode ser compartilhado por outros métodos, o que pode causar conflitos durante a leitura (proxima) e escrita de dados (contas[proxima] e proxima). 2. Não, porque poderia acontecer de uma chamada ao inserir pegar o valor de proxima, inserir naquela posição do array e, antes de poder incrementar o valor de proxima, a outra chamada ao método inserir também pegar esse mesmo valor e, mesmo após a outra chamada ter incrementado o valor de proxima, armazenar a referência da nova Conta em cima da armazenada anteriormente, visto que ela tinha o valor antigo (antes de ser incrementado) de proxima, sem falar que haveria uma posição null no array (exatamente naquela posição em que ficaria a segunda Conta a ser inserida). 3. Bastaria declarar o método inserir como synchronized, o que impediria que duas chamadas concorrentes a esse método entrassem em conflito. --------------------------------------------------------------------------------