terça-feira, 7 de julho de 2015

Dica de programador - ConcurrentModificationException



Que programador novato já não sofreu com erros chatos e ficou horas tentando resolver?

Um deles é o ConcurrentModificationException (Erro de modificação concorrente), o próprio erro ja diz, modificação concorrente, aonde 'alguém' mais está disputando uma modificação ou leitura no mesmo elemento. 

Este erro ocorre quando você entra em um elemento da lista, e do nada ele é modificado, isto ocorre mais no caso de multi-threads, aonde vários 'núcleos' da aplicação irão compartilhar da mesma lista.

Como resolver?

É simples, permitindo que somente um thread acesse a lista por vez, existem várias formas, uma delas é usando synchronized, abaixo eu tenho um exemplo de modificação concorrente:



Saida:
Configurando sessao 0
Apagado sessao 0
Indo para proxima sessao: 1
Exception in thread "Thread-0" java.util.ConcurrentModificationException
 at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
 at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
 at cc.a.CCA$1.run(CCA.java:19)
 at java.lang.Thread.run(Thread.java:745)




Para corrigir precisaremos usar synchronized sempre que formos acessar está lista, assim permitindo somente que 1 thread acesse por vez, veja o resultado:


Saida:
Configurando sessao 0
Indo para proxima sessao: 1
Configurando sessao 1
Indo para proxima sessao: 2
Configurando sessao 2
Indo para proxima sessao: 3
Configurando sessao 3
Indo para proxima sessao: 4
Configurando sessao 4
Indo para proxima sessao: 5
Configurando sessao 5
Indo para proxima sessao: 6
Configurando sessao 6
Indo para proxima sessao: 7
Configurando sessao 7
Indo para proxima sessao: 8
Configurando sessao 8
Indo para proxima sessao: 9
Configurando sessao 9
Apagado sessao 0
O segredo?

Basicamente, o synchronized vai bloquear o acesso de qualquer thread enquanto outro já estiver acessando, e só irá liberar após o acesso terminar, ele não irá impedir o acesso, só irá fazer com que ele só seja operado após o termino do atual. O synchronized pode ser usado em métodos também (public synchronized void), permitindo somente uma chamada de método por thread.

Até a próxima dica :D


Tags: ,

0 Comentarios para “Dica de programador - ConcurrentModificationException”

Postar um comentário

© SouUmByte. Todos direitos reservados.
Designed by SpicyTricks