Showing posts with label Thread. Show all posts
Showing posts with label Thread. Show all posts

Sunday, June 14, 2009

Concorrência - Iterar HashSet

Na sequência um exemplo de código que encapsula acesso a um HashSet de forma segura (nem tanto...):

public class IteracaoVulneravel {

  private Set palavras = new HashSet();

  public synchronized void removePalavra(String palavra) {
    palavras.remove(palavra);
  }

  public synchronized void addPalavra(String palavra) {
    palavras.add(palavra);
  }

  //pode lançar java.util.ConcurrentModificationException
  public void print() {
    System.out.println("Palavras = "+palavras);
  }
}

O detalhe fica no método print, o compilador implicitamente cria código para navegar na coleção usando o Iterator, para realizar o print dos elementos.
Durante a iteração no elementos ninguém garante que uma outra thread acione o método addPalavra. Caso isso aconteça uma java.util.ConcurrentModificationException será lançada!

Para evitar isso o recomendado seria sincronizar a coleção, veja.

Interessante observação do livro Java Concurrency in Practice.

Sunday, April 12, 2009

Sunday Reference

Domingão resolvi dar uma revisada na API do Java que trata referencias de objetos (Heap + GC). Semana passada me deparei com algumas delas nos testes que estava fazendo (post anterior).

Na realidade brinquei um pouco as especializações de java.lang.ref.Reference. Representam o modelo de referencia de objetos do Java e influenciando a execução do Garbage Collector (GC). São elas:

  • WeakReference: um wrapper de uma referencia (qualquer objeto) "fraca", quando necessario o GC ira eliminar.
  • SoftReference: outro wrapper, mas numa situação intermediaria nem tao fraca e nem tao forte. Na pratica tem uma durabilidade maior do que weak, mas qdo necessario - se necessário - o GC vai eliminar. Uma alternativa interessante para cache.
  • PhantomReference: o wrapper mais "frágil", o objeto já recebeu sua doze letal sem chance de escapar da pena de morte. Não há recuperação, o método get sempre retorna null.

Além dessas 3, temos outras classes nessa API:
  • WeakHashMap: Map composto pela chave WeakReference e valor a referencia, que sabe eliminar a chave qdo o valor for coletada pelo GC. Em outras coleções o WeakReference (ou os outros) não são removidos, apenas a referencia encapsulada.

Acesse o javadoc e confira.