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.