Cómo lidiar con ConcurrentModificationException

Obtengo la excepción de modificación de modalidad concurrente de mi temporizador de enfriamiento. Utilizo un hilo para reducir los valores cada segundo de esta manera:

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);
            }
        }
    }

}

Por lo tanto, cada segundo debería reducir la recuperación de cada jugador en 20, pero el problema es que obtengo el CME cada dos horas mientras ejecuto el programa, especialmente cuando hay mucha gente en línea. ¿Cómo hago para que, si todavía está modificando la lista, esperará hasta que se realice la operación actual y cree una especie de cola de modificación? ¡Gracias! Aquí está la traza de la pila:

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)

La línea 13 es el comienzo del bucle for ...

Respuestas a la pregunta(3)

Su respuesta a la pregunta