ConcurrentModificationException

Bem… vamos brincar com threads. :?

Eu tenho:
a Thread 1
a Thread 2, que é criada pela 1
a Thread 3, que é criada pela 1 (multiplique esta thread por N já que é instanciada uma para cada conexão recebida)
a Thread 4, que é criada pela 1

Na Thread 1 eu tenho uma Collection Map<Long, Object3> (Object3 é onde está a Thread3), que é instanciada da seguinte forma:

Map<Long,Object3> objects = Collections.synchronizedMap(new Hashmap <Long,Object3>());

A thread 2, só percorre a collection.
A thread 3, adiciona, busca (get) e remove um objeto da collection… a sim, lembra que pode haver N Threads 3? Então… uma pode remover outras. :?
A thread 4 só percorre a collection.

Então com tanta gente acessando o mesmo objeto nada mais compreensível que esta enhaca desse : ConcurrentModificationException :x

Todas as threads acessam a collection por public synchronized Collection <Long, Object3> getCollection() { };. Até mesmo a Thread1 o acessa por ai.

Mas os problemas ocorrem quando a Thread2 ou Thread4 estão apenas percorrendo a collection. Claro que neste momento pode haver alguma Thread3 que tente alterar a collection enquanto isto ocorre :? Eu acreditei que o super synchronized fosse resolver o problema… estava até achando que eu estava sendo redundante.

Como a collection pode conter uma lista grande de objetos e sempre estarei fazendo consultas a ela, inicialmente tentei usar TreeMap… mas por retornar tantos ConcurrentModificationException mudei para HashMap… mas os problemas continuam.

http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html

http://blogs.azulsystems.com/cliff/2007/03/a_nonblocking_h.html

Acho que isso resolve:
http://java.sun.com/javase/6/docs/api/java/util/Collections.html#synchronizedSortedMap(java.util.SortedMap)

Thingol! Perfeito! Não respondi ontem pois ainda estava fazendo testes, e precisava de uma desconexão massiva dos usuários e reconexão para testar melhor.

Resolveu meus problemas de concorrencia, realmente não conhecia. Estava pensando que teria de trocar a lógica. Há sim, testes feitos com ~140 threads (sendo a 1,2,3,4)

[]'s