Umgang mit ConcurrentModificationException

Ich erhalte eine ConcurrentModificationException von meinem Abklingzeitgeber. Ich benutze einen Thread, um die Werte jede Sekunde wie folgt zu reduzieren:

public class CoolDownTimer implements Runnable {
    @Override
    public void run() {
        for (String s : playerCooldowns.keySet()) {
            playerCooldowns.put(s, playerCooldowns.get(s) - 20);
            if (playerCooldowns.get(s) <= 0) {
                playerCooldowns.remove(s);
            }
        }
    }

}

Jede Sekunde sollte sich die Abklingzeit jedes Spielers um 20 verkürzen, aber das Problem ist, dass ich die CME alle paar Stunden bekomme, während das Programm läuft, besonders wenn viele Leute online sind. Wie kann ich sicherstellen, dass die Liste, wenn sie noch geändert wird, bis zum Abschluss des aktuellen Vorgangs wartet und eine Art Änderungswarteschlange erstellt wird? Vielen Dank! Hier ist der Stack-Trace:

2012-06-18 20:59:05 [WARNING] Task of 'SurvivorsClasses' generated an exception
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:839)
at java.util.HashMap$KeyIterator.next(HashMap.java:874)
at me.zachoooo.survivorclasses.CoolDownManager$CoolDownTimer.run(CoolDownManager.java:13)
at org.bukkit.craftbukkit.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:126)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:533)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:459)

Zeile 13 ist der Beginn der for-Schleife ...

Antworten auf die Frage(3)

Ihre Antwort auf die Frage