Exercícios

Paulo Borba

Centro de Informática

Universidade Federal de Pernambuco


  1. Considerando a seguinte classe definida em Java, altere o método inserir para que sejam levantadas exceções relativas a duas situações de erro que podem ocorrer durante a execução deste método.

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;
  }
  1. O que pode acontecer de errado caso o método inserir acima seja executado concorrentemente ao método procurar abaixo? Em que situações este erro ocorre (dica: imagine que a inserção só é feita depois da chamada ao procurarIndice)? O que deveria ser modificado nestes métodos para evitar o erro? 
Conta procurar(String n) {
  int indice = this.procurarIndice(n);

  Conta resultado = null;   

  if (indice != proxima)
    resultado = contas[indice];
  else resultado = null;
  return resultado;    
}
private int procurarIndice(String n) {
  int i = 0;
  if (n != null) {
    boolean achou = false;
    while ((!achou) && (i < proxima)) {
      if (n.equals(contas[i].getNumero()))
        achou = true;
      else i = i + 1;
    }
  } else i = proxima;
  return i;
}
  1. Altere os métodos procurar e procurarIndice acima para que a procura no array seja feita de forma concorrente, isto é, procura-se ao mesmo tempo em cada metade do array. Um thread procura na primeira métade do array e outro na segunda metade; cada thread deve ter como atributo o resultado da procura, para que este valor depois seja inspecionado pelo método  procurar. Será necessário definir métodos protected para ler os atributos do repositório. Esta é uma boa forma de aumentar a performance do método  procurar? Justifique sua resposta.