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.
No comments:
Post a Comment