terça-feira, 7 de julho de 2015
Dica de programador - ConcurrentModificationException
terça-feira, 7 de julho de 2015 por jonathanhrll
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
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: Dicas de programador , Java
Este artigo foi escrito por: jonathanhrll
Compartilhar:
Gerar url encurtada Twitter Facebook Google+ OutroMantenha-se atualizado
Inscreva-se para saber sobre as novidades no blog.
Artigos relacionados
Assinar:
Postar comentários (Atom)
0 Comentarios para “Dica de programador - ConcurrentModificationException”
Postar um comentário