Mistérios... problemas com "java.util.ConcurrentModificationException"

Olá pessoal,

Estou fazendo um curso de desenvolvimento de jogos em Java, estamos usando um projeto baseado na estrutura do apresentado no seguinte link: http://abrindoojogo.com.br/djj-index
O Mistério está no erro que tenho nos meus dois notebooks, um com windows e outro com ubuntu. Nos computadores do curso, do professor e de outros alunos o código funciona.

Bom, vamos detalhar o código para tentar esclarecer…

Temos um projeto, GameCore, que é adicionado no projeto do jogo, nas propriedades do projeto em ‘Java Build Path’.

então criamos a classe principal do jogo, estendendo a classe Game do GameCore, assim:

[code]public class Animation extends Game {

public Animation() {
	super("Animacao");
}

@Override
public void onLoad() {

}

@Override
public void onUnload() {

}

@Override
public void onUpdate(int currentTick) {

}

@Override
public void onRender(Graphics2D g) {

}

public static void main(String[] args) {
	new Animation().run();
}

}[/code]

Quando eu tento usar o teclado, ocorre esse erro…

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
	at java.util.ArrayList$Itr.next(ArrayList.java:831)
	at com.game.core.InputManager.update(InputManager.java:57)
	at com.game.core.Game.run(Game.java:67)
	at Main.main(Main.java:10)

Veja abaixo a classe InputManager, e em seguida o looping faz o update do teclado.

***CORRIGIDO, TINHA POSTADO OUTRA CLASSE…

package com.game.core;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.HashMap;

public class InputManager implements KeyListener {

	protected static final int KEY_RELEASED = 0;
	protected static final int KEY_JUST_PRESSED = 1;
	protected static final int KEY_PRESSED = 2;

	private static InputManager instance;
	private HashMap<Integer, Integer> keyCache;
	private ArrayList<Integer> pressedKeys;
	private ArrayList<Integer> releasedKeys;

	private InputManager() {
		keyCache = new HashMap<Integer, Integer>();
		pressedKeys = new ArrayList<Integer>();
		releasedKeys = new ArrayList<Integer>();
	}

	public static InputManager getInstance() {
		if (instance == null) {
			instance = new InputManager();
		}
		return instance;
	}

	public boolean isPressed(int keyId) {
		return keyCache.containsKey(keyId)
				&& keyCache.get(keyId).equals(KEY_PRESSED);
	}

	public boolean isJustPressed(int keyId) {
		return keyCache.containsKey(keyId)
				&& keyCache.get(keyId).equals(KEY_JUST_PRESSED);
	}

	public boolean isReleased(int keyId) {
		return keyCache.containsKey(keyId)
				&& keyCache.get(keyId).equals(KEY_RELEASED);
	}

	public void update() {
		for (Integer keyCode : keyCache.keySet()) {
			if (isJustPressed(keyCode)) {
				keyCache.put(keyCode, KEY_PRESSED);
			}
		}


		for (Integer keyCode : pressedKeys) {
			if (isReleased(keyCode)) {
				keyCache.put(keyCode, KEY_JUST_PRESSED);
			} else {
				keyCache.put(keyCode, KEY_PRESSED);
			}
		}
		
		for (Integer keyCode : releasedKeys) {
			keyCache.put(keyCode, KEY_RELEASED);
		}
		
		pressedKeys.clear();
		releasedKeys.clear();
	}

	@Override
	public void keyPressed(KeyEvent e) {
		pressedKeys.add(e.getKeyCode());
	}

	@Override
	public void keyReleased(KeyEvent e) {
		releasedKeys.add(e.getKeyCode());
	}

	@Override
	public void keyTyped(KeyEvent e) {
	}
}

LOOPING

public void run() {
		active = true;
		load();
		expectedTPS = 50;
		expectedNanosPerTick = GameSpeedTracker.NANOS_IN_ONE_SECOND
				/ expectedTPS;
		maxFrameSkip = 10;
		long nanoTimeAtNextTick = System.nanoTime();
		int skippedFrames = 0;
		while (active) {
			speedTracker.update();
			if (System.nanoTime() > nanoTimeAtNextTick
					&& skippedFrames < maxFrameSkip) {
				nanoTimeAtNextTick += expectedNanosPerTick;
				keyboard.update();
				update();
				skippedFrames++;
			} else {
				render();
				skippedFrames = 0;
			}
		}
		unload();
	}

A tecla não permanece pressionada, ela volta para release e repete o ciclo, just pressed e pressed, voltando para release mesmo sem soltar a tecla. Logo em seguida vem esse erro.
Lembrando que esse ocorre em meu PC pessoal, com Linux e em outro com Windows 7, mas nos PCs do curso e no PC do professor está funcionando como esperado!

Desde Já agradeço a todos!

Resolvi o problema no UBUNTU, desligando a repetição de teclas pressionadas. No windows ainda não pude testar.